首页 > 解决方案 > cmake 删除之前添加的 TARGET_COMPILE_OPTIONS

问题描述

我有一个 cmake 项目,它是一些更大环境的一部分。

我必须使用一些 cmake makros/函数来设置我的项目。

在某些时候,他们添加了一个编译标志:

TARGET_COMPILE_OPTIONS (${name} PUBLIC "$<$<CONFIG:Release>:/GL>")

但是,我想在之后删除这个标志,因为它会给我的项目带来一些不便。

但是cmake中似乎有一个错误:

我试图从INTERFACE_COMPILE_OPTIONSand中删除标志COMPILE_OPTIONS(这是target_compile_options根据cmake doku添加选项)。
message删除前后的命令显示成功,但生成的vcxproj文件仍然包含

  <WholeProgramOptimization>true</WholeProgramOptimization>

<ItemDefinitionGroup><ClCompile> 节中。
所以似乎添加/GL标志会触发一些内部状态更改,之后无法删除。(如果我在必须调用的宏中删除该标志的添加,则该WholeProgramOptimization节点不会添加到 vcxproj)

我错过了什么?

我可以添加一个/GL-作为选项,但随后我收到很多D9025警告(用 /GL- 覆盖 /GL)

(使用 cmake 3.15 和 3.13 测试)

标签: visual-c++cmake

解决方案


事实证明,问题在于我必须使用的 cmake 脚本将优化器设置设置PUBLIC为范围

TARGET_COMPILE_OPTIONS (${name} PUBLIC "$<$<CONFIG:Release>:/GL>")`
                                ^^^^^^

我的项目的另一个依赖项使用相同的函数并将此标志放入其中INTERFACE_COMPILE_OPTIONS,并且我的项目继承此选项而无法删除它。

唯一的方法似乎是固定公共脚本以使用PRIVATE范围。这会更合乎逻辑,因为它是一个对消费者没有任何影响的内部目标属性。


推荐阅读