【问题标题】:CMake cross-compiling: C flags from toolchain file ignoredCMake交叉编译:工具链文件中的C标志被忽略
【发布时间】:2012-07-10 12:28:24
【问题描述】:

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

【问题讨论】:

  • 谢谢!我有这个确切的问题。

标签: c cmake cross-compiling flags


【解决方案1】:

我找到了一个临时解决方案,通过替换该行

SET(CMAKE_C_FLAGS "-std=gnu99")

通过

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

【讨论】:

  • 可以了,谢谢(我在“项目”指令之后添加了一行)
  • 这拯救了我的夜晚。
【解决方案2】:

我只是想添加一些背景信息(例如在这里讨论过how to setup cmake_c/xx_flags per toolchain?)。

简而言之,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.")

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

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

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

另一个经常找到的解决方案是使用类似的东西:

add_definitions(" -std=gnu99")

注入编译标志(但这不是构建配置感知的,因为变量定义是)。另见CMake clang and c++0x

在 CMake 2.8.12 中引入了新命令,因此您可以这样做(未测试,只是为了展示可能性):

add_compile_options("$<$<CONFIG:RELASE>:-std=gnu99>")
add_compile_options("$<$<CONFIG:DEBUG>:-std=gnu99 -g3>")

有关更多信息,请参阅 What is the modern method for setting general compile flags in CMake?CMake generator expression, differentiate C / C++ code

【讨论】:

    猜你喜欢
    • 2012-06-18
    • 2017-03-31
    • 1970-01-01
    • 2019-08-17
    • 2020-06-05
    • 2013-07-10
    • 1970-01-01
    • 2015-10-14
    相关资源
    最近更新 更多