CMake 能编译但运行/调试异常的问题及解决方法
问题描述
在windows系统下使用 CMake + MSYS2进行C++开发,但在源码main.cpp中增加C++11以上的语法后, 使用cmake 编译, 能够生成可执行文件, 但运行和调试时不显示任何输出结果. 源码如下:
#include <iostream> #include <vector> int main(int, char**) { std::vector<int> v{ 1,2,3}; // 列表初始化, C++11支持的语法 for (auto &&i : v) // ranged-for, C++11支持的语法 { std::cout << i << std::endl; } std::cout << "Hello, world! "; }
一开始以为是未指定C++版本的缘故, 但在CMakeLists.txt中添加如下内容, 未能解决问题.
set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True)
后来发现, 是因为电脑上安装了两个 gcc/g++, 一个为C:Strawberrycing++.exe(4.9.2) (以前安装perl时安装的), 另一个为C:msys64mingw64ing++.exe(11.2.0), 且低版本的gcc/g++在前. 运行如下命令, 查看g++的所在的位置和顺序:
where g++
运行如下命令, 查看默认g++的版本:
g++ --version
解决方法
编辑系统变量和用户变量中PATH, 将高版本 gcc/g++的路径移动至低版本之前. 使用CMake重新编译后,能够正常运行. 运行结果如下: