【发布时间】:2019-11-21 07:52:41
【问题描述】:
所以我正在开发一个旨在在远程服务器上运行的项目。我在本地电脑上开发程序,编译它,然后上传到远程服务器。本地电脑和远程服务器都在 CentOS 7.7 上运行。
该程序是使用 CLion IDE 开发的,配置了 CMake。该程序依赖于一些共享库,它们应该根据我在 CMake 中编写的内容链接到可执行文件。在我的本地 PC 上,我可以完美地编译和运行程序。但是,我scp整个项目目录到远程服务器后,可执行文件无法运行。根据ldd 所说,它找不到任何“.so”文件。
这是我的 CMakeList.txt,每个路径都是相对路径,而不是绝对路径。
cmake_minimum_required(VERSION 3.15)
project(YS_Test)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_PATH_ src)
file(GLOB SOURCE_FILES_ ${SOURCE_PATH_}/*.*)
set(PROJECT_LIBS_ libTapQuoteAPI.so libTapTradeAPI.so libTapDataCollectAPI.so)
include_directories(api/include)
link_directories(api/lib/linux)
add_executable(YS_Test ${SOURCE_FILES_})
target_link_libraries(YS_Test ${PROJECT_LIBS_})
请不要告诉我设置LD_LIBRARY_PATH 来解决我的问题。该程序在没有LD_LIBRARY_PATH 的情况下在我的本地电脑上运行良好,所以我希望它可以在没有LD_LIBRARY_PATH 的远程服务器上运行。我想知道这里到底发生了什么,而不是解决问题。谢谢!
【问题讨论】:
-
构建可执行文件时,CMake 默认将库的绝对路径作为 RPATH 嵌入其中。如果在 scp 之后更改库的路径,则需要手动控制 RPATH,CMake 提供了方法:gitlab.kitware.com/cmake/community/wikis/doc/cmake/…。 (如果您在问题中添加更多详细信息,该帮助可能会更详细。例如,确切的错误消息、PC 上可执行文件和库的确切位置以及
scp之后等等)。 -
我不明白为什么这个问题被否决了。 OP 想知道 Linux 动态链接器在尝试解决依赖关系时是如何工作的。用“centos”或“linux”标记问题也很好,但每个问题只有 5 个标签可用!
-
@Pedro 我们开始 ^_^
标签: linux cmake centos shared-libraries