【发布时间】:2015-10-04 23:54:39
【问题描述】:
我是 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 找到这个库?
【问题讨论】:
-
cmake 手册中提到了 link_libraries “该命令仅适用于调用后创建的目标。”目标是用 add_executable() 命令创建的吗?也许您需要将 add_executable() 命令移到 link_directories() 之后。
-
如果我这样做,我会收到错误
Cannot specify link libraries for target "test" which is not built by this project. -
请确定:您的命令顺序现在是 1) link_directories()、2) add_executable() 和 3) target_link_libraries()?
-
使用
find_package(Protobuf)而不是直接尝试定位。请参阅cmake.org/cmake/help/v3.3/module/FindProtobuf.html 了解更多信息。 -
如果 find_package() 对你不起作用,下一个最佳选择是 find_library(PROTOBUF protobuf /usr/lib/x86_64-linux-gnu) 然后在你的 target_link_libraries 中使用 ${PROTOBUF} () 命令。环顾网络,您会看到很多人建议(有时强烈)反对使用 link_directories()。甚至 CMake 文档似乎也建议使用 find_library() 。