我刚刚开始学习CMake并且认为我会理解首先编写的基本过程CMakeLists.txt
,然后配置生成CMakeCache.txt
并最终生成Makefiles
.
但是,当我尝试将它应用于以下CMakeLists.txt时,我没有得到预期的结果,我不确定出了什么问题.CMakeLists.txt的一部分如下所示:
# compiler flags if (CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fpermissive -Wall -Wformat-security") if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-local-typedefs") endif() endif()
由于我使用的是gcc/g ++ 4.7.3,因此应该设置第一个if语句的编译器标志.但是如果我使用CMake-Gui配置它,则没有任何预定义的编译器标志.当我对if语句进行评论并且只保留时,也会发生同样的情况set(CMAKE_CXX_FLAGS ...)
.在搜索CMakeCache.txt
任何-std=c++11
标志时,我也没有得到任何结果.
为什么会这样?CMakeLists.txt
在不使用它们时在内部指定编译器标志有什么意义?或者我得到了一些完全错误的东西而且他们被使用了,但后来我不知道为什么以及如何检查.
当生成实际(Eclipse CDT)项目make
并将其导入Eclipse时,我收到无法解析C++ 11功能的错误消息,__cplusplus
宏包含该值,199711
因此-std=c++11
显然不使用该标志.
您在CMakeLists.txt文件中指定的标志可能已被编译器正确使用.你不能直接在CMakeCache.txt中看到它们,但是:
您可以通过运行make VERBOSE=1
而不是标准来查看命令行make
此外,您可以设置CMAKE_VERBOSE_MAKEFILE
为1以启用命令打印(可以通过在CMake GUI中选中"高级"来找到)
正如@Angew所说,如果你真的想在CMake GUI中看到更新的标志,请设置你的变量CACHE FORCE
作为一个例子,我在一个项目中使用这种配置一个月,从来没有问题:
if(MSVC) # MSVC compiler (Win32 only) # Display more warnings set(CMAKE_CXX_FLAGS "/W3") elseif(UNIX OR CMAKE_COMPILER_IS_GNUCXX) # Clang OR Gcc (Linux, Mac OS or Win32 with MingW) # Enable C++11 and displays all warnings set(CMAKE_CXX_FLAGS "-Wall -std=c++11") if(APPLE) # Clang / Mac OS only # Required on OSX to compile c++11 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -mmacosx-version-min=10.7") endif(APPLE) endif()
更新:
从CMake 3.0开始,您可以替换set(CMAKE_CXX_FLAGS "...")
为add_compile_options(-std=c++11)
CMake 3.1引入了一种新的语法来配置具有特定C++版本的编译器:
set(CMAKE_CXX_STANDARD 11)