Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类似于在CMake中删除\u目标\u编译\u定义_C++_Cmake_Compilation_Linker - Fatal编程技术网

C++ 类似于在CMake中删除\u目标\u编译\u定义

C++ 类似于在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_

我有一个大型回购协议,其中包含许多应用程序。还有一个pkgconfig
a
,它定义了一个CFLAG
SOMEFLAG
(在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:在堆栈溢出时,当您发现您已经提出的问题可能更详细时,首选的方法是它将保留现有问题,而不是提出新问题并放弃/删除以前的问题。