【问题标题】:COMPILE_OPTIONS property not populated in CMakeCMake 中未填充 COMPILE_OPTIONS 属性
【发布时间】: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 将返回 $&lt;$&lt;CONFIG:RELWITHDEBINFO&gt;:/Od&gt;。但它不应该也从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 具有相同的性质。因此,您可以在单独的目录中创建您的特定目标,并调整变量的值。

标签: c++ cmake


【解决方案1】:

1) 不,COMPILE_OPTIONS 是目标属性。它没有全球版本,也找不到。

2) 不,这些是在定义目标之前通过add_compile_options 使用目录属性初始化的。那不在脚本中,根本不使用CMAKE_CXX_FLAGS_RELWITHDEBINFO。因此,没有定义目标属性。

3) 不,因为CMAKE_CXX_FLAGS_RELWITHDEBINFO 是一个变量而不是一个属性,并且没有文档表明这些属性是由任何变量初始化的。

4) 这正是答案是否定的原因,并且在初始化属性时没有提及变量。

5) 您可以这样做,但是否有必要。当生成器从变量和属性中收集所有不同的编译选项时。所以你要做的只是添加冗余选项和新选项。它不会取代旧的。

这个问题似乎与昨天提出的问题有关。 How to override optimization level flag in modern CMake

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-06
    • 2014-08-27
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多