Cmake 找不到使用“link_directories”的库

新手上路,请多包涵

我是 Ubuntu,我正在学习 cmake 和 make,只是尝试一个简单的例子。我有两个目录: srcbuild 。在 src 中,我有两个文件: main.cppCMakeLists.txt ,其中(仅)以下文本:

 add_executable(test main.cpp)
link_directories(/usr/lib/x86_64-linux-gnu)
target_link_libraries(test protobuf)

/usr/lib/x86_64-linux-gnu 中,有一个名为 libprotobuf.so 的共享库,我想链接它。我的 main.cpp #include <google/protobuf/message.h> 使用这个库中的函数。

现在,在我的 build 目录中,我运行 cmake ../src ,然后 make 。但是,然后我收到链接器错误,告诉我对 protobuf 库中的某些函数存在未定义的引用。如果我搜索 build 中的所有文件和子目录,则没有提及与 protobuf 相关的任何内容。

但是,如果我在我的 CMakeLists.txt 文件中删除 link_directories 行,而是在指定可执行文件时写入库的完整路径,即 target_link_libraries(test /usr/lib/x86_64-linux-gnu/libprotobuf.so) ,它会编译和链接很好。

为什么 link_directories 不允许cmake找到这个库?

原文由 Karnivaurus 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
1 个回答

不要在 CMake 中像这样使用 link_directories

这是初学者的常见错误,因为许多其他构建环境都是这样工作的,但在 CMake 中它只是自找麻烦。甚至 官方文档 也特别建议不要这样做:

请注意,此命令 [ link_directories ] 很少需要。 find_package()find_library() 返回的库位置是绝对路径。将这些绝对库文件路径直接传递给 target_link_libraries() 命令。 CMake 将确保链接器找到它们。

因此, 始终将绝对路径传递target_link_libraries 并使用 find_library 来解析链接目录:

 find_library(PROTOBUF_LIBRARY protobuf HINTS /usr/lib/x86_64-linux-gnu)
target_link_libraries(test PUBLIC ${PROTOBUF_LIBRARY})

这有一个巨大的好处,如果无法找到预期的库,您可能会在 CMake 配置时获得诊断,而不是在编译时出现随机链接器错误。此外,如果目标机器具有非标准目录布局,这允许用户通过 GUI 指定库位置。

因此,如果它不能立即工作,请务必检查 find_library 调用的结果并查阅官方文档以找出它没有按预期找到您的库的原因。

原文由 ComicSansMS 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏