C++ 类似于在CMake中删除\u目标\u编译\u定义
我有一个大型回购协议,其中包含许多应用程序。还有一个pkgconfigC++ 类似于在CMake中删除\u目标\u编译\u定义,c++,cmake,compilation,linker,C++,Cmake,Compilation,Linker,我有一个大型回购协议,其中包含许多应用程序。还有一个pkgconfiga,它定义了一个CFLAGSOMEFLAG(在CMakeCache.txt中类似于 \u pcimport\u A\u compile\u定义:INTERNAL=SOMEFLAG )此回购链接中定义了多个目标,针对A。现在我想从文件F中的一个目标T中去掉SOMEFLAG,F只有一个目标T。在其CMakeLists.txt中: target_link_libraries(T PUBLIC A) get_target_
a
,它定义了一个CFLAGSOMEFLAG
(在CMakeCache.txt中类似于
\u pcimport\u A\u compile\u定义:INTERNAL=SOMEFLAG
)此回购链接中定义了多个目标,针对A。现在我想从文件F
中的一个目标T
中去掉SOMEFLAG
,F
只有一个目标T
。在其CMakeLists.txt中:
target_link_libraries(T PUBLIC A)
get_target_property(flags T COMPILE_DEFINITIONS)
list(REMOVE_ITEM flags SOMEFLAG)
set_property(TARGET T PROPERTY COMPILE_DEFINITIONS ${flags})
remove_definitions(-DSOMEFLAG)
我只想从目标T
(或文件F
)中删除SOMEFLAG
,而不想从回购协议中删除其他目标。我尝试了不同的方法:
// import pkgconfig A, then
get_target_property(flags A INTERFACE_COMPILE_DEFINITIONS)
list(REMOVE_ITEM flags SOMEFLAG)
set_target_properties(A PROPERTIES INTERFACE_COMPILE_DEFINITIONS "${flags}")
但这将从回购协议中所有不正确的目标中删除SOMEFLAG
。我也在F的CMakeLists.txt中尝试过:
target_link_libraries(T PUBLIC A)
get_target_property(flags T COMPILE_DEFINITIONS)
list(REMOVE_ITEM flags SOMEFLAG)
set_property(TARGET T PROPERTY COMPILE_DEFINITIONS ${flags})
remove_definitions(-DSOMEFLAG)
当我测试时,它没有从T中删除SOMEFLAG
。我也在F的CMakeLists.txt中尝试过:
target_link_libraries(T PUBLIC A)
get_target_property(flags T COMPILE_DEFINITIONS)
list(REMOVE_ITEM flags SOMEFLAG)
set_property(TARGET T PROPERTY COMPILE_DEFINITIONS ${flags})
remove_definitions(-DSOMEFLAG)
Docs说,从编译器命令行中为当前目录和以下目录中的源代码删除标志(由add_定义添加)。
但是当我测试时,它仍然没有从T或F中删除SOMEFLAG
我想我需要像
remove\u target\u compile\u definition
这样的东西,它应该在最后删除其中的编译定义,所以在T
链接A
并添加SOMEFLAG
之后,这个命令将为我从T中删除SOMEFLAG
,并且它也不会影响repo中的其他目标。有这样的方法吗?或者最坏的情况是,我必须从A
中删除该标志,这意味着该标志将从回购协议中链接到A
的所有目标中删除,并且我需要为回购协议中除T
之外的所有其他目标重新添加该标志,这意味着需要付出大量努力,并且无法扩展到未来的应用程序中(默认情况下,链接时应添加此标志)这是否回答了您的问题?remove\u definitions
声明它与add\u definitions
使用的定义一起工作,但是SOMEFLAG
不是由add\u definitions
添加的SOMEFLAG
是a
接口的一部分。您是否尝试从target中删除SOMEFLAG
在目标T
文件CMakeLists.txt
中有一个INTERFACE\U COMPILE\U DEFINITIONS`?或者在编译T
时,您可以尝试使用target\U COMPILE\U选项
和-U SOMEFLAG
来编译定义。coder2:在堆栈溢出时,当您发现您已经提出的问题可能更详细时,首选的方法是它将保留现有问题,而不是提出新问题并放弃/删除以前的问题。