[英]Compiler Flags from CMakeLists.txt don't appear in CMake-Gui or CMakeCache.txt
我刚开始学习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语句进行out-comment并保留set(CMAKE_CXX_FLAGS ...)
发生同样的情况。 在CMakeCache.txt
搜索任何-std=c++11
标志时,我也没有得到任何结果。
为什么会这样? 在不使用CMakeLists.txt
时,在CMakeLists.txt
中指定编译器标志有什么意义? 或者我得到了一些完全错误的东西而且他们被使用了,但后来我不知道为什么以及如何检查。
使用make
生成实际(Eclipse CDT)项目并将其导入Eclipse时,我收到无法解析C ++ 11功能的错误消息, __cplusplus
宏包含值199711
因此-std=c++11
显然没有使用-std=c++11
旗。
您在CMakeLists.txt文件中指定的标志可能已被编译器正确使用。 你不能直接在CMakeCache.txt中看到它们,但是:
make VERBOSE=1
而不是标准make
来查看命令行 CMAKE_VERBOSE_MAKEFILE
设置为1以启用命令打印(可以通过在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开始,您可以用add_compile_options(-std=c++11)
替换set(CMAKE_CXX_FLAGS "...")
add_compile_options(-std=c++11)
CMake 3.1引入了一种新的语法来配置具有特定C ++版本的编译器:
set(CMAKE_CXX_STANDARD 11)
您可以先将变量设置为仅在缓存不在缓存中的值。 最后一个参数是我们不需要的描述,因为无论如何我们都会覆盖它。
set(VARIABLE "Hello World!" CACHE STRING "")
然后使用上面一行中的现有值将值强制进入缓存。 由于这是缓存的,用户仍然可以更改变量,并且每次都不会被设置。
set(VARIABLE ${VARIABLE} CACHE STRING "Description." FORCE)
你可以看到,这在CMake中有点笨拙,但它可靠地工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.