库中的 CMake 链接目录

Posted

技术标签:

【中文标题】库中的 CMake 链接目录【英文标题】:CMake link_directories from library 【发布时间】:2015-07-01 05:16:05 【问题描述】:

我正在尝试使用 CMake 和 Xcode 从另一个库链接到一个库。 这对任何库来说都是一个问题,但为了更容易传达,我们以zlib 为例。

这似乎适用于以下可执行文件:

LINK_DIRECTORIES($LIB_DIR/zlib/build/)
ADD_EXECUTABLE(MY_EXECUTABLE ...

它会生成一个 Xcode 项目,其设置如下所示:

如您所见,$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 位已正确添加到 zlib 库路径中。

但如果我尝试这样做:

LINK_DIRECTORIES($LIB_DIR/zlib/build/)
ADD_LIBRARY(MY_LIBRARY ...

当我将zlib 链接到MY_LIBRARY 时,zlib 永远不会链接到MY_EXECUTABLE

ADD_LIBRARY 之后的TARGET_LINK_LIBRARIES 允许我从MY_LIBRARY 链接到zlib,但我必须指定完整路径,它不能作为配置(调试、发布等)以及有效的平台(iphoneos、iphonesimulator等)是因素。

我想做的是将zlib 添加到Xcode 库搜索路径中,并带有$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 位,如上所示。

【问题讨论】:

如果可以的话,你应该尝试看看你的库是否有一个 CMake 模块来简化这个过程。以 zlib 为例:cmake.org/cmake/help/v3.0/module/FindZLIB.html . 关于在多配置环境的路径中添加Debug、Release等:target_link_libraries的参数可以使用generator expressions,语法为$<...>(同时注意策略CMP0003) .那你试过TARGET_LINK_LIBRARIES(MY_LIBRARY $LIB_DIR/zlib/build/$<CONFIG>/...)吗? @Florian 太好了!这就像一个魅力。我使用了TARGET_LINK_LIBRARIES(MY_LIBRARY $LIB_DIR/zlib/build/$<CONFIG>$(EFFECTIVE_PLATFORM_NAME)/libz.a,Xcode 用适当的平台替换了CONFIG。将此作为答案发布,我会接受。 【参考方案1】:

把我的评论变成答案

CMake 确实支持使用generator expressions 向多配置环境中的路径添加适当的配置(参见例如CMake - Accessing configuration parameters of multiple-configuration generators)

target_link_libraries() 的参数支持使用生成器表达式。因此,在您的情况下,您可以使用如下所示的 $<CONFIG> 生成器表达式:

TARGET_LINK_LIBRARIES(MY_LIBRARY $LIB_DIR/zlib/build/$<CONFIG>/...)

请注意 - 如果您可能更改了某些政策 - target_link_libraries() 文档中有关政策 CMP0003 - Libraries linked via full path no longer produce linker search paths 和 CMP0004 - Libraries linked may not have leading or trailing whitespace 的一条注释:

但是请注意,生成器表达式不会在 OLD 中使用 处理 CMP0003 或 CMP0004

【讨论】:

以上是关于库中的 CMake 链接目录的主要内容,如果未能解决你的问题,请参考以下文章

CMAKE 如何告诉 makefile 链接库?

cmake - 全局链接器标志设置(适用于目录中的所有目标)

如何使用cmake生成基于静态库的动态链接库

使用 CMake 在库中查找符号

仅当我在自己的库中使用犰狳链接错误

Cmake:将子目录链接模式覆盖为 LINK_PRIVATE