我在使用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 库中某些函数有未定义的引用。如果我在 CMakeLists.txt
文件中删除 link_directories
这一行,而是在指定可执行文件时写入库的完整路径,即 target_link_libraries(test /usr/lib/x86_64-linux-gnu/libprotobuf.so)
,它就可以编译和链接成功。
为什么 link_directories
不能让 cmake 找到这个库呢?
find_package(Protobuf)
命令来定位Protobuf库,不要直接尝试寻找它。有关更多信息,请参阅http://www.cmake.org/cmake/help/v3.3/module/FindProtobuf.html。 - tamas.kenez