我已经在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,因此,如果您发现我的CMakeLists.txt有任何改进,那将是非常令人高兴的事情。
通过CMake生成Makefile,如果我运行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文件中进行哪些更改?
答案 0 :(得分:0)
您当前正在
install (TARGETS QSample DESTINATION bin)
请改用以下命令(bin文件夹的完整路径,我的是/ usr / local / bin)
install(TARGETS QSample DESTINATION /usr/local/bin)
接下来,当您在bin文件夹中有一些可执行文件的地方时,您要做的就是写没有./
的可执行文件名称。即,在您的提示中,只需键入QSample即可,它应该可以运行
$QSample
我目前正在研究ubuntu,上面的工作对我来说很好。希望对您有所帮助。
简而言之,将可执行文件放入bin文件夹后,您可以从系统中的任何位置运行它们,而无需专门进入安装目录。
答案 1 :(得分:0)
(简而言之)
在 add_executable 行之前,将以下行添加到CMakeLists.txt:
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。这样,您的程序就可以在安装之前正常启动。
在安装过程中,作为安装过程的一部分,该信息已从可执行文件中剥离,无法再找到您的lib。您可以通过在安装过程中查看输出来识别什么。搜索以下内容:
-- 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