Kar*_*rus 41 c++ makefile cmake
我是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)
Run Code Online (Sandbox Code Playgroud)
在/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找到这个库?
Com*_*sMS 60
不要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})
Run Code Online (Sandbox Code Playgroud)
这有一个巨大的好处,如果找不到预期的库,您可能会在CMake配置时获得诊断,而不是在编译时出现随机链接器错误.此外,如果目标机器具有非标准目录布局,这允许用户通过GUI指定库位置.
因此,如果它不能立即生效,请务必检查find_library调用结果并查阅联机帮助页以查找无法按预期找到库的原因.
aar*_*rkk 48
请确保您的来电link_directories进行呼叫之前,给相关add_executable.
我错误地认为它只需要在召唤之前target_link_libraries,但事实并非如此.移动呼叫后,库正确链接.
Make sure that the order will be link_directories, set PROJECT_LINK_LIBS, add_executable and then target_link_libraries.
Below is example to demonstarte it:
cmake_minimum_required(VERSION 2.8.9)
project (Logging)
include_directories(include)
file(GLOB LOGGINGSOURCES "libsrc/*.cpp")
file(GLOB SOURCES "src/*.cpp")
add_library(convertString SHARED ${LOGGINGSOURCES})
install(TARGETS convertString DESTINATION /root/Deepak/)
link_directories( /root/Deepak/ )
set(PROJECT_LINK_LIBS libconvertString.so)
add_executable(hello ${SOURCES})
target_link_libraries(hello ${PROJECT_LINK_LIBS} )
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
51523 次 |
| 最近记录: |