Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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添加\编译\定义,但适用于所有目标_C++_C_Cmake - Fatal编程技术网

C++ Cmake添加\编译\定义,但适用于所有目标

C++ Cmake添加\编译\定义,但适用于所有目标,c++,c,cmake,C++,C,Cmake,是否有方法在cmake中为创建的所有目标创建定义。到目前为止,当我 add_compile_definitions(MYDEFINITION) 在我的根CmakeLists.txt中,它似乎只为在该文件中创建的目标创建这些定义。但是我想为在子目录中创建的所有目标创建定义。最好的方法是什么?我通常为所有目标设置属性的解决方案是简单地添加一个common目标,该目标具有我想要添加到所有目标的接口属性 add_library(common INTERFACE) target_compile_def

是否有方法在cmake中为创建的所有目标创建定义。到目前为止,当我

add_compile_definitions(MYDEFINITION)

在我的根CmakeLists.txt中,它似乎只为在该文件中创建的目标创建这些定义。但是我想为在子目录中创建的所有目标创建定义。最好的方法是什么?

我通常为所有目标设置属性的解决方案是简单地添加一个
common
目标,该目标具有我想要添加到所有目标的接口属性

add_library(common INTERFACE)

target_compile_definition(common INTERFACE MYDEFINITION)
最妙的是,您还可以设置其他内容,如警告设置:

target_compile_options(common INTERFACE
    $<$<CXX_COMPILER_ID:MSVC>:/Wall>
    $<$<CXX_COMPILER_ID:GNU,Clang>:-Wall -Wextra>
)

似乎
soo,嗯。。。不,似乎没有。请创建一个。请注意,
add\u compile\u definitions
会影响在它之后定义的目标,因此在
add\u subdirectory
之前也会影响它。我认为这就是问题所在。但是,在add_子目录之前执行此操作的问题是,我忽略了子目录中的一些条件,这些条件会更改这些定义。在cmake中有没有一个好的方法来处理这个问题?子目录中的条件会影响它上面的内容?一个好方法是不要编写意大利面代码——每个目录只影响下面的内容。重新构造代码。一个好方法是永远不要使用
add\u compile\u定义
,而只使用
target.*
东西。
add_library(mylib ...)
add_executable(myexe ...)

target_link_libraries(mylib PRIVATE common)
target_link_libraries(myexe PRIVATE common)