因此,我正在研究一个旨在在远程服务器上运行的项目。我在本地PC上开发程序,将其编译,然后将其上传到远程服务器。本地计算机和远程服务器都在CentOS 7.7上运行。
该程序是使用配置了CMake的CLion IDE开发的。该程序依赖于一些共享库,这些共享库应该根据我在CMake中编写的内容链接到可执行文件。在本地PC上,我可以完美地编译和运行该程序。但是,scp
将项目的整个目录移到远程服务器后,可执行文件将无法运行。根据提示,它找不到任何“ .so”文件ldd
。
这是我的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
要解决的问题。该程序在没有本地计算机的情况下在我的本地PC上运行良好LD_LIBRARY_PATH
,因此我希望它可以在没有Windows Server 2003的远程服务器上运行LD_LIBRARY_PATH
。我想知道这里到底发生了什么,而不是解决。谢谢!
如果我正确理解了您的问题,则希望将已编译的YS_Test
程序与某些依赖项一起交付,并使其在远程服务器上运行。默认情况下,可执行文件将仅在中配置的目录中查找/etc/ld.so
,其中不包括部署路径。
注意:通常,您不会部署整个构建目录,而只会部署已编译的工件和依赖项。对于此答案,我将假定您将二进制文件及其依赖项部署到同一目录。
您有两种选择:
LD_LIBRARY_PATH
自行设置,也可以通过包装脚本进行设置。此变量将指示动态链接器也查找指定的目录。即使您不喜欢此解决方案,它也是迄今为止最常用的方法。添加-Wl,-rpath='$ORIGIN'
到您的链接器选项。这会将DT_RUNPATH
属性添加到可执行文件的动态部分。在使用CMake时,您还可以使用BUILD_RPATH
和/或INSTALL_RPATH
目标属性进行设置。ld.so联机帮助页对该属性的描述如下:
如果共享库依赖项不包含斜杠,则将按以下顺序搜索它:
- ...
- 使用二进制文件的DT_RUNPATH动态节属性中指定的目录(如果存在)。
该$ORIGIN
部分将扩展到包含程序或共享库的目录。
如果您真的坚持要BUILD_RPATH_USE_ORIGIN
交付构建目录(例如,在开发过程中),则可以查看CMake属性(及其通常的全局对应CMAKE_BUILD_RPATH_USE_ORIGIN),这会将相对路径嵌入二进制文件而不是绝对路径。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句