gpt4 book ai didi

c++ - Cmake 找不到使用 "link_directories"的库

转载 作者:IT老高 更新时间:2023-10-28 12:28:57 26 4
gpt4 key购买 nike

我是 Ubuntu,我正在学习 cmake 和 make,只是尝试一个简单的例子。我有两个目录:srcbuild .在 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 库中的某些函数存在 undefined reference 。如果我搜索 build 中的所有文件和子目录, 没有提到任何与 protobuf 相关的内容。

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

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

最佳答案

不要在 CMake 中像这样使用 link_directories

这是初学者的常见错误,因为许多其他构建环境都是这样工作的,但在 CMake 中它只是自找麻烦。偶the official documentation特别建议不要这样做:

Note that this command [link_directories] is rarely necessary. Library locations returnedby find_package() and find_library() are absolute paths. Pass theseabsolute library file paths directly to the target_link_libraries()command. CMake will ensure the linker finds them.

因此,总是将绝对路径传递给 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 调用的结果并查阅官方文档以找出它没有按预期找到您的库的原因。

关于c++ - Cmake 找不到使用 "link_directories"的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31438916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com