我正在使用target_link_libraries
对依赖关系进行建模,正如this博客文章中所做的那样。
target_link_libraries(Foo
LibraryA
LibraryB
)
这个方法运行得很好,但是由于各种原因,我需要使用add_custom_target
通过一个自定义命令来预处理一个文件。问题是,这个自定义目标依赖于LibraryA和LibraryB的包含。我真的希望像target_link_libraries
那样做下面的事情(参见LibraryA和LibraryB位):
add_custom_target(Bar ALL
COMMAND ${CMAKE_C_COMPILER} thing.cpp LibraryA LibraryB /P
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/Path/Here
COMMENT "Preprocessing to a file"
VERBATIM
)
然而,这并不起作用。LibraryA和LibraryB是按照它们出现的样子放进去的。即使它起作用了,我想我会得到比include更多的东西,因为我认为目标也包括了库。也许这不是一个好的方法。
那么,我在这里能做些什么呢?我如何从每个目标中提取包含目录,以便在定制命令中使用?我发现如果我find_package(Foo REQUIRED)
,我可以访问Foo_DIR
,但它指向的是构建目录,而不是包含目录所在的源目录。
2条答案
按热度按时间yyyllmsg1#
您可以使用
get_target_property()
从每个目标提取包含目录。目标的INCLUDE_DIRECTORIES
属性包含该目标的包含目录。由于您有两个目标,LibraryA
和LibraryB
,因此我们必须调用它两次。然后,我们可以使用foreach()
将包含目录列表连接在一起。如果您在编译器命令中使用这些包含目录(例如MSVC),您也可以将/I
compiler option附加到循环中的每个目录:然后,您可以使用建构的
INCLUDE_COMPILER_STRING
变数呼叫自订目的命令:如果你想要更简洁的东西,你可以使用这里的生成器表达式示例,它获取目标的包含目录,并在你的自定义目标命令中内联展开它们。
v7pvogib2#
作为评论,目前接受的答案没有处理传递依赖。这个问题已经困惑了我一整天,所以我现在整理出来。
我在构建LibraryLinkUtilities here .这是我在项目中使用的CMakeLists.txt文件:
当我用 Visual Studio 打开**.sln时,它运行得很好,我的意思是我可以用任何构建类型构建它。但是我发现 Configuation 中的 include directories 是空的。这让我抓狂,因为我想知道项目包含了哪个目录。然后我使用函数
print_target_properties
fixed here打印了关于导入目标**的所有属性:注意红线处,
LLU::LLU
依赖于WSTP::WSTP
和WolframLibrary::WolframLibrary
.所以我用这段代码打印所有包含的目录: