我正在尝试从目标中检索当前的编译标志(这是来自CMAKE_CXX_FLAGS_RELWITHDEBINFO
的默认标志),以打印它们,然后替换这些标志之一,并设置已更改的标志列表通过target_compile_options
。然而,这篇文章只是关于编译选项的第一部分。我已经在下面的代码中在注释中添加了问题/问题:
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
可执行文件是用 both 和全局标记以及附加到hello
目标的标记进行编译的。
4)可能相关:prop_tgt:COMPILE_OPTIONS documentation说“此属性在创建目标时由COMPILE_OPTIONS目录属性初始化,并且供生成器用来设置编译器的选项。” 和prop_dir:COMPILE_OPTIONS documentation说“创建目标时,此属性用于初始化COMPILE_OPTIONS目标属性,生成器使用该属性来设置编译器的选项。” 。 / p>
所以我要做的是以下内容。我想获取RELWITHDEBINFO
配置的cmake-default编译标志。然后,对于一个特定的目标,我想将/O2
替换为/Od
(默认值),并将该目标的编译选项设置为这些修改的目标。
在不修改全局标志(非常不好的做法)或向目标两次添加编译选项的情况下,我似乎找不到解决方法。
答案 0 :(得分:0)
1)不,COMPILE_OPTIONS
是目标属性。没有全局版本,也找不到。
2)否,在定义目标之前,这些文件会通过add_compile_options
使用directory属性进行初始化。那不在脚本中,根本不使用CMAKE_CXX_FLAGS_RELWITHDEBINFO
。因此,没有定义目标属性。
3)不,因为CMAKE_CXX_FLAGS_RELWITHDEBINFO
是变量而不是属性,并且没有文档说明属性由任何变量初始化。
4)这就是为什么答案为“否”且在初始化属性时未提及变量的原因。
5)您可以执行此操作,但这是必需的。当生成器收集所有不同的编译选项时,它既来自变量又来自属性。因此,您要做的只是添加冗余选项和新选项。它不会取代旧的。
这个问题似乎与昨天提出的问题有关。 How to override optimization level flag in modern CMake