【问题标题】:CMake's link_directories issue with static library (on Mac OS X)CMake 的静态库的 link_directories 问题(在 Mac OS X 上)
【发布时间】:2015-11-30 06:46:21
【问题描述】:

我在 /PATH 目录中有一个静态库,当我尝试使用带有 link_directories 的库时,如下所示:

link_directories(/PATH)
target_link_libraries(CppHello libHelloLib.a)

我收到一条错误消息:

ld: library not found for -lHelloLib
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [/PATH] Error 1
make[2]: *** [CMakeFiles/CppHello.dir/all] Error 2
make[1]: *** [CMakeFiles/CppHello.dir/rule] Error 2

相反,我必须按如下方式指定路径才能使其工作:

target_link_libraries(CppHello /PATH/libHelloLib.a)

可能出了什么问题?这是 Mac OS X 上 Cmake 的问题,还是我错过了什么?

【问题讨论】:

  • 另一个你调用link_directories()的问题在创建可执行文件:link_directories只影响目标,在它之后创建:stackoverflow.com/questions/33559356/…
  • @Tsyvarev 在我看来这才是真正的答案。有前缀和后缀的问题在这里似乎没有造成任何问题,我对 CMake 的测试表明它知道删除它们。
  • @bames53:是的,命令的顺序肯定会影响正确性。问题是我只有在发布答案后才注意到这种错误。那么问题只是重复的,我认为在这种情况下不需要提供答案。

标签: macos cmake


【解决方案1】:

您调用link_directories()在创建可执行文件:link_directories 只影响目标,在它之后创建:https://cmake.org/cmake/help/v3.4/command/link_directories.html。结果是正确的-lHelloLib 标志被添加到目标,但lib 搜索路径没有更新-L/PATH 标志。

而是在创建任何目标之前调用link_directories()。


自 3.3 版以来,target_link_libraries 的 CMake 文档明确指定了它接受哪种类型的链接项目。其中:

  • 库文件的完整路径
  • 简单的库名

因此,您应该指定库文件的完整路径,或库的唯一名称,不带文件扩展名(.a) 和前缀(@987654329 @)。您的错误消息显示,CMake 已尝试处理仅文件名的库,但没有成功(某种 未定义的行为)。

虽然以前版本的 CMake 没有如此清楚地记录此命令,但它们可能遵循相同的约定。

【讨论】:

  • “你调用 link_directories() AFTER 创建可执行文件:link_directories 只影响目标,创建 AFTER 它”——我多次阅读文档,但不知怎的,我没有抓住关键的一句话……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 2012-08-15
  • 2016-09-26
  • 1970-01-01
相关资源
最近更新 更多