我使用cmake的对交叉编译。 在我的工具链文件中有一条线
SET(CMAKE_C_FLAGS "-std=gnu99")
这个变量没有设置的CMakeLists.txt再次。
当我运行cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ..
这个标志被忽略。
为了更详细的:所述的线flags.cmake
显示一个空C_FLAGS =
线。 但在CMakeOutput.log
我能找到一个行Build flags: -std=gnu99
。
我发现的第二次运行cmake ..
(同有或没有指定的工具链文件)修复此问题。
但是,为什么不设置我第一次运行cmake?
编辑:添加MNWE
的CMakeLists.txt:
cmake_minimum_required(VERSION 2.6)
project(myproject)
SET(files src/main.c)
add_executable(myexec ${files})
avr.cmake:
SET(CMAKE_SYSTEM_NAME Generic)
SET(CMAKE_C_COMPILER avr-gcc)
SET(CMAKE_C_FLAGS "-std=gnu99")
我已经找到了一个临时的解决方案通过更换线
SET(CMAKE_C_FLAGS "-std=gnu99")
通过
SET(CMAKE_C_FLAGS "-std=gnu99" CACHE STRING "" FORCE)
我只是想补充一些背景信息(例如这里讨论如何建立cmake_c /每工具链xx_flags? )。
总之, CMAKE_<LANG>_FLAGS
变量通过在设计缓存CMake<Lang>Information.cmake
脚本(这意味着你可以在配置步骤之后,改变他们的CMake的GUI应用程序)。
所以,你必须-如果它们设置工具链文件-把它们放在缓存第一。 CMake的自己的脚本(工具链文件后执行)不来了FORCE
,这样就不会再覆盖它。
看看到CMakeCInformation.cmake(从共享\的cmake-2.8 \模块):
set(CMAKE_C_FLAGS_INIT "$ENV{CFLAGS} ${CMAKE_C_FLAGS_INIT}")
# avoid just having a space as the initial value for the cache
if(CMAKE_C_FLAGS_INIT STREQUAL " ")
set(CMAKE_C_FLAGS_INIT)
endif()
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS_INIT}" CACHE STRING
"Flags used by the compiler during all build types.")
正如你所看到的,这样做将使用官方的方式CMAKE_C_FLAGS_INIT
注入额外的标志。 这个问题存在,在工具链文件后改变将不被认可(缓存将不会被覆盖,见上文)。
取到所有这些因素,你的临时解决方案是正确的选择。 要真正知道-因为工具链文件会在配置/生成过程解析两次-你甚至可以添加一个UNSET
设置之前调用CMAKE_C_FLAGS
在工具链文件:
UNSET(CMAKE_C_FLAGS CACHE)
SET(CMAKE_C_FLAGS "-std=gnu99" CACHE STRING "" FORCE)
另一个经常找到的解决方案是使用这样的:
add_definitions(" -std=gnu99")
注入编译标志(但这不是构建配置意识到,作为变量定义)。 另见CMake的铛和C ++ 0x中
随着CMake的2.8.12出现了新的命令出台,所以你可以做(没有测试,只是为了显示的可能性):
add_compile_options("$<$<CONFIG:RELASE>:-std=gnu99>")
add_compile_options("$<$<CONFIG:DEBUG>:-std=gnu99 -g3>")
见什么是在CMake的设置一般编译标志的现代方法是什么? 和CMake的发电机表达,分化C / C ++代码以获得更多关于这一点。