CMake 中的 set_target_properties 是否会覆盖 CMAKE_CXX_FLAGS?
在我的 CMake 项目开始时,我在变量 CMAKE_CXX_FLAGS 中设置通用编译标志,稍后
set(CMAKE_CXX_FLAGS "-W -Wall ${CMAKE_CXX_FLAGS}")
,我需要附加其他特定于配置的编译标志(存储在 BUILD_FLAGS 中)。我可以使用以下命令来实现此目的:
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS ${BUILD_FLAGS})
还是必须手动添加 CMAKE_CXX_FLAGS:
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${BUILD_FLAGS}")
以防止 CMAKE_CXX_FLAGS 被 BUILD_FLAGS 覆盖?
At the beginning of my CMake project, I'm setting general compilation flags in the variable CMAKE_CXX_FLAGS, like
set(CMAKE_CXX_FLAGS "-W -Wall ${CMAKE_CXX_FLAGS}")
Later on, I need to append additional configuration-specific compilation flags (stored in BUILD_FLAGS). Can I use the following command for this:
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS ${BUILD_FLAGS})
or do I have to add the CMAKE_CXX_FLAGS manually:
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${BUILD_FLAGS}")
to prevent CMAKE_CXX_FLAGS being overriden by BUILD_FLAGS?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
已接受的答案仍然有效,但自 2013 年以来已过时。
此答案基于 CMake v2.8.12、v3.3 和 v3.13 中的新函数。
自 CMake-2.8.12 (2013) 以来,
有两个用于设置
CMAKE_CXX_FLAGS
的新命令:target_compile_options()
(对于一个目标)add_compile_options()
(对于所有目标)
自cmake-2.8.12以来,上一个版本的文档没有太大变化:
target_compile_options()
add_compile_options()
在您的情况下,您可以使用:
或者如果您只有一个目标:
更多示例
已弃用
COMPILE_FLAGS
cmake-3.0 文档 将
COMPILE_FLAGS
标记为已弃用:如果您仍然想使用
set_target_properties()
,您可以使用COMPILE_OPTIONS
而不是COMPILE_FLAGS
:自 CMake-3.3 (2015)
Anton Petrov 建议使用 生成器表达式,如 ar31 的答案< /a>.
CMake 生成器表达式将您的
${BUILD_FLAGS}
应用到:$
的 C++ 语言(也可以是C
、CUDA
...)$
的 Clang 编译器
(也可以是
gcc
的GNU
,或者 Visual C++ 的MSVC
...请参阅 完整列表)(如果语言是 C,则使用
$
代替)在您的情况下,您可以使用:
或关于编译器:
自 CMake-3.13 (2018) 起
新函数
target_link_options()
允许将选项传递给链接器,如Craig Scott所述。C 和 C++ 文件的不同选项
最好的方法是使用两个不同的目标来区分 C 文件和 C++ 文件。
The accepted answer is still working but outdated since 2013.
This answer is based and new functions from CMake v2.8.12, v3.3 and v3.13.
Since CMake-2.8.12 (2013)
Two new commands to set
CMAKE_CXX_FLAGS
:target_compile_options()
(for one single target)add_compile_options()
(for all targets)The documentation of last version has not changed a lot since cmake-2.8.12:
target_compile_options()
add_compile_options()
In you case you can use:
Or simply if you have a single target:
More examples
Deprecated
COMPILE_FLAGS
cmake-3.0 documentation flags
COMPILE_FLAGS
as deprecated:If you still want to use
set_target_properties()
you may useCOMPILE_OPTIONS
instead ofCOMPILE_FLAGS
:Since CMake-3.3 (2015)
Anton Petrov suggests to use generator expressions as presented in an answer of ar31.
The CMake generator expressions applies your
${BUILD_FLAGS}
to:$<COMPILE_LANGUAGE:CXX>
(can also beC
,CUDA
...)$<CXX_COMPILER_ID:Clang>
(can also be
GNU
forgcc
, orMSVC
for Visual C++... see full list)(use
$<C_COMPILER_ID:Clang>
instead if language is C)In you case you can use:
or about compilers:
Since CMake-3.13 (2018)
A new function
target_link_options()
allow to pass options to the linker, as mentioned by Craig Scott.Different options for C and C++ files
The best way is to distinguish C files and C++ files using two different targets.
使用第一个:
编译 TARGET 源代码时,BUILD_FLAGS 中存储的标志将附加在 CMAKE_CXX_FLAGS 之后。文档暗示了这一点,但我刚刚尝试过以确保这一点。
完整的命令行相当于:
正如 Ramon 所说,您可以随时使用
make VERBOSE=1
进行检查。Use the first one:
The flags stored in BUILD_FLAGS are appended after CMAKE_CXX_FLAGS when compiling the sources of TARGET. The documentation hints at this, but I've just tried it to make sure.
The full command line will be the equivalent of:
And as Ramon said, you can always check with
make VERBOSE=1
.