CMake交叉编译:忽略工具链文件中的C标志

ejo*_*rns 17 c flags cmake cross-compiling

我使用cmake进行交叉编译.在我的工具链文件中有一行

SET(CMAKE_C_FLAGS "-std=gnu99")
Run Code Online (Sandbox Code Playgroud)

此变量未再次在CMakeLists.txt中设置.

当我运行cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ..此标志被忽略.

更详细:显示一行flags.cmakeC_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})
Run Code Online (Sandbox Code Playgroud)

avr.cmake:

SET(CMAKE_SYSTEM_NAME Generic)

SET(CMAKE_C_COMPILER avr-gcc)

SET(CMAKE_C_FLAGS "-std=gnu99")
Run Code Online (Sandbox Code Playgroud)

ejo*_*rns 19

我通过更换线找到了一个临时解决方案

SET(CMAKE_C_FLAGS "-std=gnu99")
Run Code Online (Sandbox Code Playgroud)

通过

SET(CMAKE_C_FLAGS "-std=gnu99" CACHE STRING "" FORCE)
Run Code Online (Sandbox Code Playgroud)


Flo*_*ian 12

我只是想添加一些背景信息(例如在这里讨论如何为每个工具链设置cmake_c/xx_flags?).

简而言之,CMAKE_<LANG>_FLAGS变量在CMake<Lang>Information.cmake脚本中按设计进行缓存(这意味着您可以在配置步骤后在CMake的GUI应用程序中更改它们).

所以你必须 - 如果在Toolchain文件中设置它们- 首先将它们放入缓存中.CMake自己的脚本(在Toolchain文件之后执行)没有附带FORCE,所以它不会再次覆盖它.

看看CMakeCInformation.cmake(来自share\cmake-2.8\Modules):

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.")
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,正式的方法是使用CMAKE_C_FLAGS_INIT注入额外的标志.问题在于,工具链文件中的后续更改将无法识别(缓存不会被覆盖,请参见上文).

考虑到所有这些因素,您的临时解决方案是正确的选择.要确定 - 因为工具链文件在配置/生成过程中被解析了两次 - 您甚至可以UNSET在设置CMAKE_C_FLAGS工具链文件之前添加一个调用:

UNSET(CMAKE_C_FLAGS CACHE)
SET(CMAKE_C_FLAGS "-std=gnu99" CACHE STRING "" FORCE)
Run Code Online (Sandbox Code Playgroud)

另一个经常找到的解决方案是使用以下内容:

add_definitions(" -std=gnu99")
Run Code Online (Sandbox Code Playgroud)

注入编译标志(但这不是构建配置,因为变量定义是).另请参阅CMake clang和c ++ 0x

使用CMake 2.8.12,引入了新的命令,所以你可以做(​​没有测试,只是为了显示可能性):

add_compile_options("$<$<CONFIG:RELASE>:-std=gnu99>")
add_compile_options("$<$<CONFIG:DEBUG>:-std=gnu99 -g3>")
Run Code Online (Sandbox Code Playgroud)

请参阅在CMake中设置常规编译标志的现代方法是什么?CMake生成器表达式,在此更多地区分C/C++代码.