CMake的交叉编译:从工具链文件C标志忽略(CMake cross-compiling: C fl

2019-06-14 19:28发布

我使用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")

Answer 1:

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

SET(CMAKE_C_FLAGS "-std=gnu99")

通过

SET(CMAKE_C_FLAGS "-std=gnu99" CACHE STRING "" FORCE)


Answer 2:

我只是想补充一些背景信息(例如这里讨论如何建立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 ++代码以获得更多关于这一点。



文章来源: CMake cross-compiling: C flags from toolchain file ignored