【发布时间】:2018-12-20 00:14:29
【问题描述】:
我正在尝试从目标检索当前编译标志(这将是默认标志,来自 CMAKE_CXX_FLAGS_RELWITHDEBINFO),打印它们,然后替换其中一个标志,并通过 @ 设置更改后的标志列表987654324@。然而,这篇文章只是关于第一部分,获取编译选项。我已将问题/问题放在下面的代码中的 cmets 中:
cmake_minimum_required(VERSION 3.13.2)
project(hello)
add_executable(hello WIN32 hello.cpp)
# target_compile_options(hello PUBLIC "$<$<CONFIG:RELWITHDEBINFO>:/Od>")
# (see below comment for this)
get_property(HELLO_GLOBAL_COMPILE_OPTIONS GLOBAL PROPERTY COMPILE_OPTIONS) # both GLOBAL and DIRECTORY return an empty variable
message(${HELLO_GLOBAL_COMPILE_OPTIONS})
# 1) => This returns an empty variable. Shouldn't this have been populated with the contents of CMAKE_CXX_FLAGS_RELWITHDEBINFO?
get_target_property(HELLO_COMPILE_OPTIONS hello COMPILE_OPTIONS)
get_target_property(HELLO_COMPILE_OPTIONS_INTERFACE hello INTERFACE_COMPILE_OPTIONS)
message(${HELLO_COMPILE_OPTIONS})
message(${HELLO_COMPILE_OPTIONS_INTERFACE})
# 2) => These both print HELLO_COMPILE_OPTIONS-NOTFOUND. Shouldn't they have been populated with the contents of CMAKE_CXX_FLAGS_RELWITHDEBINFO at this stage?
message(${CMAKE_CXX_FLAGS_RELWITHDEBINFO})
# This prints as expected, "/MD /Zi /O2 /Ob1 /DNDEBUG" (for MSVC).
3) 如果我取消注释第 5 行的 target_compile_options,HELLO_COMPILE_OPTIONS 将返回 $<$<CONFIG:RELWITHDEBINFO>:/Od>。但它不应该也从CMAKE_CXX_FLAGS_RELWITHDEBINFO 返回“全局”标志吗?
因为hello 可执行文件是使用 全局标志和附加到hello 目标的标志编译的。
4) 可能相关:prop_tgt:COMPILE_OPTIONS documentation 说 “此属性在创建目标时由 COMPILE_OPTIONS 目录属性初始化,生成器使用它来设置编译器的选项。” prop_dir:COMPILE_OPTIONS documentation 说 “该属性用于在创建目标时初始化 COMPILE_OPTIONS 目标属性,生成器使用该属性为编译器设置选项。”。
所以我想做的是以下。我想获得 RELWITHDEBINFO 配置的 cmake-default 编译标志。然后,对于一个特定目标,我想将/O2(默认)替换为/Od,并将该目标的编译选项设置为这些修改后的选项。
如果不修改全局标志(非常糟糕的做法)或向我的目标添加两次编译选项,我似乎无法找到一种方法。
【问题讨论】:
-
"但它不应该也从
CMAKE_CXX_FLAGS_RELWITHDEBINFO返回"全局"标志吗?" - 不,不应该。这些“全局”标志(连同CMAKE_CXX_FLAGS)仅在创建编译器的命令行时才与从目标属性中获取的标志组合在一起。但是,变量CMAKE_CXX_FLAGS实际上是“每个目录”。大概,CMAKE_CXX_FLAGS_RELWITHDEBINFO具有相同的性质。因此,您可以在单独的目录中创建您的特定目标,并调整变量的值。