Cmake无法使用“ link_directories”找到库

在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相关的任何内容。


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


为什么link_directories不允许cmake查找此库?


慕虎7371278
浏览 3467回答 3
3回答

富国沪深

不要link_directories在CMake中这样使用。这是一个常见的初学者的错误,因为许多其他构建环境都可以像这样工作,但是在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调用结果并查阅手册页以查找为什么找不到所需的库。
打开App,查看更多内容
随时随地看视频慕课网APP