库中的 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 链接目录的主要内容,如果未能解决你的问题,请参考以下文章