【发布时间】:2021-08-04 06:05:21
【问题描述】:
好吧,标题显然很奇怪。我希望任何能清楚地定义我的好奇心的人,都会将标题编辑成正确的标题。
在使用CMakeLists.txt时,我们通常通过命令find_package()宏导入第三方包,该宏会寻找合适的find_XXX.cmake脚本,然后输出XXX_LIBRARIES、XXX_INCLUDE_DIRECTORIES等变量。
但是,最近我发现了一些 add_library() 宏的指令指南,它可以包含实际的库二进制文件作为其源(?),就像这样:
add_library(my_target STATIC IMPORTED foo.lib)
我猜,只要名称 my_target 实际上是一个目标名称,那么我们就可以向该目标添加另一个组合,就像任何其他 cmake 目标一样,如下所示。
target_inlcude_directories(my_target PUBLIC ${PKG_PREFIX}/include)
target_link_directories(my_target PUBLIC ${PKG_PREFIX}/lib)
target_compile_features(my_target PUBLIC std_cxx_17)
如果这是可能的,那么这不是更简洁的方式来描述导出的包的组成,而不是为每个手动链接和添加那些冗长的 *_LIBS *_DIRS 变量吗?像下面这样?
add_executable(foo ${MY_SOURCES})
find_package(xxx)
# BEFORE
target_link_directories(foo PRIVATE ${XXX_LINK_DIRECTORIES}) # note: I don't remember what was it exactly.
target_link_libraries(foo PRIVATE ${XXX_LIBRARIES})
target_include_directories(foo PRIVATE ${XXX_INCLUDE_DIRECTORIES})
# AFTER
target_link_libraries(foo PRIVATE xxx::my_target)
我是不是在想一些无效的东西?
【问题讨论】:
-
这取决于包是否暴露目标。许多人都这样做。示例:openssl 定义
OpenSSL::SSL和OpenSSL::Crypto。你用它代替OPENSSL_SSL_LIBRARY。但并非所有人都这样做,然后您又回到了旧方式。 -
啊,是不是已经被广泛使用的方法了?谢谢,我不知道。我会结束这个问题......对不起,我可以在没有任何接受的答案的情况下结束这个问题吗?
-
现代 cmake 实践的好读物:cliutils.gitlab.io/modern-cmake (我相信如果不再有用,您可以删除自己的问题,或者等待有人回答 - 我不会,得马上离开)