找不到 CMake 链接的库

CMake linked librarys cannot be found

本文关键字:链接 CMake 找不到      更新时间:2023-10-16

我在Linux机器上使用ZeroMQ库创建了一个非常基本的c ++示例。

构建项目

为了构建这个项目,我决定使用 CMake。目前我的CMakeLists.txt看起来像这样:

cmake_minimum_required (VERSION 3.9)
project(QSample)
# add ZMQ cmake files and find libzmq
set (ZeroMQ_DIR "/home/vtd/DEV_JOHANN/ZEROMQ/INSTALL_CMAKE/")
find_package(ZeroMQ REQUIRED)
# include also the zmq c++ wrapper
set(SOURCES qSample.cpp /home/vtd/DEV_JOHANN/ZEROMQ/INSTALL/include/zmq.hpp)
add_executable(QSample ${SOURCES})
# add the zmq include path
target_include_directories(QSample PRIVATE "/home/vtd/DEV_JOHANN/ZEROMQ/INSTALL/include")
# add the zmq libs
link_directories("/home/vtd/DEV_JOHANN/ZEROMQ/INSTALL/lib64")
# link the libs
TARGET_LINK_LIBRARIES(QSample libzmq)
# rule to copy the bin to the install folder
install (TARGETS QSample DESTINATION bin)

如您所见,我已经更改了默认的 zmq 安装路径。这是我第一次尝试使用 CMake,所以如果你发现我的 CMakeList 有任何改进.txt那就太好了。

通过 CMake 生成生成文件可以工作,如果我运行sudo make它会构建我的项目。在那之后我跑sudo make install.现在我的问题来了:

在构建文件夹中运行程序

如果我在指定的 CMake 生成文件夹中运行./QSample,我的应用程序将按预期运行。

ldd ./QSample输出 :

linux-vdso.so.1 (0x00007fff78384000)
libzmq.so.5 => /home/vtd/DEV_JOHANN/ZEROMQ/INSTALL/lib64/libzmq.so.5 (0x00007efeb3f4a000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007efeb3cf9000)
librt.so.1 => /lib64/librt.so.1 (0x00007efeb3af1000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007efeb3965000)
libm.so.6 => /lib64/libm.so.6 (0x00007efeb35d2000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007efeb35b8000)
libc.so.6 => /lib64/libc.so.6 (0x00007efeb31f6000)
/lib64/ld-linux-x86-64.so.2 (0x00007efeb4026000)

在安装文件夹中运行程序

如果我现在切换到我的特定安装文件夹,我无法再运行./QSample

/QSample:加载共享库时出错:libzmq.so.5:无法打开共享对象文件:没有这样的文件或目录

ldd ./QSample输出:

linux-vdso.so.1 (0x00007ffd975d4000)
libzmq.so.5 => not found
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fcac89d3000)
librt.so.1 => /lib64/librt.so.1 (0x00007fcac87cb000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fcac863f000)
libm.so.6 => /lib64/libm.so.6 (0x00007fcac82ac000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fcac8292000)
libc.so.6 => /lib64/libc.so.6 (0x00007fcac7ed0000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcac8c26000)

现在,我不清楚为什么我不能在安装文件夹中运行它。我需要在我的 CMake 文件中更改什么?

您当前正在执行

install (TARGETS QSample DESTINATION bin)

请改用以下内容(您的 bin 文件夹的完整路径,我的是/usr/local/bin(

install(TARGETS QSample DESTINATION /usr/local/bin)

接下来,当您在bin文件夹中有一些可执行文件时,您需要做的就是写下没有./的可执行文件名称

即在您的提示符中,只需键入QSample,它应该可以工作

$QSample

我目前正在研究 ubuntu,以上对我来说效果很好。希望对您有所帮助。

简短地说,一旦您将可执行文件放在 bin 文件夹中,您就可以从系统中的任何位置运行它们,而无需专门进入安装目录。

(簡要(

将以下行添加到 CMakeLists.txt 中,在第add_executable行之前:

set (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

(不简要介绍(

您的问题是 rpath 处理。默认情况下,对于链接阶段,cmake 将使用-rpath链接器选项启动将所有自动发现的带有链接库的文件夹直接放入可执行程序中。

(假设你使用的是"Unix Makefiles"生成器(,如果你开始编译/链接

make VERBOSE=1

在链接阶段,您将看到类似

g++  [lot of everything] -Wl,-rpath,/home/vtd/DEV_JOHANN/ZEROMQ/INSTALL/lib64

这意味着在启动可执行文件时,运行时链接器将首先在文件夹/home/vtd/DEV_JOHANN/ZEROMQ/INSTALL/lib64中搜索,然后再搜索 $LD_LIBRARY_PATH。这允许您的程序在安装之前正常启动。

在安装过程中,作为安装过程的一部分,此信息将从可执行文件中删除,并且无法再找到您的库。您可以通过在安装过程中查看输出来确定内容。搜索以下内容:

-- Installing: /usr/local/bin/QSample
-- Set runtime path of "/usr/local/bin/QSample" to ""

末尾的空引号表示 rpath 被剥离。

一种解决方案是将您的 lib 文件夹添加到LD_LIBRARY_PATH中,例如:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/vtd/DEV_JOHANN/ZEROMQ/INSTALL/lib64 ./QSample

或:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/vtd/DEV_JOHANN/ZEROMQ/INSTALL/lib64
./QSample

另一种解决方案是指示 CMAKE 不要剥离 rpath 数据。只需在第add_executable行之前将以下行添加到 CMakeLists.txt 中:

set (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

这是非常彻底地解释 cmake 中的 rpath 处理的链接:

https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/RPATH-handling