为了账号安全,请及时绑定邮箱和手机立即绑定

Cmake无法使用“ link_directories”找到库

Cmake无法使用“ link_directories”找到库

C++
慕虎7371278 2019-10-18 10:57:29
在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查找此库?
查看完整描述

3 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

不要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调用结果并查阅手册页以查找为什么找不到所需的库。


查看完整回答
反对 回复 2019-10-18
  • 3 回答
  • 0 关注
  • 3636 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信