作为构建过程的一部分,我们需要记录机器和编译器的细节。由于可以通过设置CMAKE_CXX_COMPILER来更改编译器与系统默认值的关系,所以我认为最安全的检测编译器的方法是问cmake自己它使用的是什么。
这是我们在项目中使用的工具链文件的(重要部分):
SET(CMAKE_CXX_FLAGS "-std=c++11")
SET(CMAKE_BUILD_TYPE Release)
SET(CMAKE_OSX_ARCHITECTURES "x86_64" )
SET(CMAKE_CXX_COMPILER /usr/bin/clang++)
SET(CMAKE_C_COMPILER /usr/bin/clang)现在,我已经创建了一个CMakeLists.txt文件,它与我们在主要项目中使用的文件不同,如下所示:
cmake_minimum_required(VERSION 2.8)
execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version
OUTPUT_VARIABLE cxx_version)
FILE(WRITE "/tmp/compiler.txt" "Compiler: ${CMAKE_CXX_COMPILER} is ${cxx_version}")当我在这个CMakeLists.txt上运行cmake并把工具链文件传递给它时,我得到了一个相当安全的方法来确定主项目使用哪个编译器。也就是说,虽然一些草率的开发人员可能会在主项目的命令行中添加一个"-DCMAKE_CXX_COMPILER“(然后/tmp/piler.txt会出错),但是开发人员更有可能编辑工具链文件(然后/tmp/编译程序. That将包含正确的信息)。
问题是,我还想检查是否启用了c++11,但是在我的CMakeLists.txt文件中,我无法检查任何CMAKE变量的设置。如果我这么做:
MESSAGE(STATUS "CMAKE_OSX_ARCHITECTURES are ${CMAKE_OSX_ARCHITECTURES}")
MESSAGE(STATUS "CMAKE_BUILD_TYPE is ${CMAKE_BUILD_TYPE}")
MESSAGE(STATUS "CMAKE_CXX_FLAGS are ${CMAKE_CXX_FLAGS}")消息说,所有这些值都是空的。如果我将自己的一些值添加到我的工具链文件中,并在我的CMakeLists.txt中打印出它们的值,它们是正确的,所以我知道工具链文件正在被处理。
我看到了一些提示,可能是cmake放弃了CMAKE_CXX_FLAGS的值,因为我的CMakeLists.txt没有编译任何东西。这个是可能的吗?或者,cmake只是将其变量的值内化为我的CMakeLists.txt看不到的方式?
发布于 2014-02-14 11:34:18
你需要写这个变量来缓存,示例
设置(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11“缓存字符串”一些信息“强制)
注意,在project命令之后更新标志:
message("release flags: ${CMAKE_CXX_FLAGS_RELEASE}")
cmake_minimum_required(VERSION 2.8.4)
project(foo CXX)
message("release flags: ${CMAKE_CXX_FLAGS_RELEASE}")输出:
release flags:
-- The CXX compiler identification is GNU 4.8.2
-- Check for working CXX compiler: /usr/bin/c++.exe
-- Check for working CXX compiler: /usr/bin/c++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
release flags: -O3 -DNDEBUG
-- Configuring done
-- Generating done
-- Build files have been written to: ...https://stackoverflow.com/questions/21763488
复制相似问题