我是 Ubuntu,我正在学习 cmake 和 make,只是尝试一个简单的例子。我有两个目录: src
和 build
。在 src
中,我有两个文件: main.cpp
和 CMakeLists.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 许可协议
不要在 CMake 中像这样使用
link_directories
。这是初学者的常见错误,因为许多其他构建环境都是这样工作的,但在 CMake 中它只是自找麻烦。甚至 官方文档 也特别建议不要这样做:
因此, 始终将绝对路径传递 给
target_link_libraries
并使用find_library
来解析链接目录:这有一个巨大的好处,如果无法找到预期的库,您可能会在 CMake 配置时获得诊断,而不是在编译时出现随机链接器错误。此外,如果目标机器具有非标准目录布局,这允许用户通过 GUI 指定库位置。
因此,如果它不能立即工作,请务必检查
find_library
调用的结果并查阅官方文档以找出它没有按预期找到您的库的原因。