我刚刚开始学习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
时,在make
中指定编译器标志有什么意义?或者我得到了一些完全错误的东西而且他们被使用了,但后来我不知道为什么以及如何检查。
当使用__cplusplus
生成实际(Eclipse CDT)项目并将其导入Eclipse时,我收到无法解析C ++ 11功能的错误消息,199711
宏包含值-std=c++11
所以显然没有使用make VERBOSE=1
标志。
您在CMakeLists.txt文件中指定的标志可能已被编译器正确使用。你不能直接在CMakeCache.txt中看到它们,但是:
make
而不是标准CMAKE_VERBOSE_MAKEFILE
来查看命令行CACHE FORCE
设置为1以启用命令打印(可以通过在CMake GUI中选中“高级”来找到)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()
作为一个例子,我在一个项目中使用这种配置一个月,从来没有问题:
set(CMAKE_CXX_FLAGS "...")
更新:
从CMake 3.0开始,您可以用add_compile_options(-std=c++11)
替换new syntax
CMake 3.1引入了一个set(CMAKE_CXX_STANDARD 11)
来配置具有特定C ++版本的编译器:
set(VARIABLE "Hello World!" CACHE STRING "")
您可以先将变量设置为仅在缓存不在缓存中的值。最后一个参数是我们不需要的描述,因为无论如何我们都会覆盖它。
set(VARIABLE ${VARIABLE} CACHE STRING "Description." FORCE)
然后使用上面一行中的现有值将值强制进入缓存。由于这是缓存的,用户仍然可以更改变量,并且每次都不会被设置。
qazxswpoi
你可以看到,这在CMake中有点笨拙,但它可靠地工作。