将 CMAKE_CXX_FLAGS 传递给 target_compile_options

Posted

技术标签:

【中文标题】将 CMAKE_CXX_FLAGS 传递给 target_compile_options【英文标题】:Pass CMAKE_CXX_FLAGS to target_compile_options 【发布时间】:2015-02-02 17:04:51 【问题描述】:

我正在尝试将所有原始 CMAKE_CXX_FLAGS 像参数一样传递给 target_compile_options 函数。

CMakeLists.txt

set(CMAKE_CXX_FLAGS $CMAKE_CXX_FLAGS -std=c++0x -Wall -pedantic -Werror -Wextra)

# I'd wish this target_compile_options
target_compile_options(my_target INTERFACE $CMAKE_CXX_FLAGS)

这给了我一个错误:

g++.exe: error:  -std=c++0x -Wall -pedantic -Werror -Wextra: No such file or directory

我知道一个简单的解决方案是:

target_compile_options(my_target INTERFACE -std=c++0x -Wall -pedantic -Werror -Wextra)

但我想保留原来的SET(CMAKE_CXX_FLAGS ...),可以吗?

提前致谢!

【问题讨论】:

【参考方案1】:

这可能是因为CMAKE_CXX_FLAGS 需要一个字符串(参数用空格分隔),而target_compile_options 使用list(参数用分号分隔)。

作为一个快速技巧,您可以尝试使用string 命令以分号分隔所有空格:

 # this will probably break if you omit the "s
set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=c++0x -Wall -pedantic -Werror -Wextra")

string(REPLACE " " ";" REPLACED_FLAGS $CMAKE_CXX_FLAGS)
target_compile_options(my_target INTERFACE $REPLACED_FLAGS)

请注意,在现实世界中,您永远不会希望同时设置CMAKE_CXX_FLAGS 设置target_compile_options。您应该坚持使用一种方法(根据我的经验,target_compile_options 从长远来看不太可能造成麻烦)并始终使用正确的字符串分隔符。

【讨论】:

有效!非常感谢!我知道,而且他们在不同的项目中,但我想到了这个问题,我忍不住想解决它。

以上是关于将 CMAKE_CXX_FLAGS 传递给 target_compile_options的主要内容,如果未能解决你的问题,请参考以下文章

传递编译器选项 cmake

为啥 CMake 在没有 CMAKE_CXX_FLAGS 的情况下生成 Makefile?

使用opensll加解密压缩文件

我可以阻止 GoogleTest-build 修改全局 CMAKE_CXX_FLAGS 变量吗?

如何将对象数组作为道具传递给组件,然后将数组的成员作为道具传递给嵌套组件?

作业五