scp之后C ++可执行文件无法链接到共享库

杰拉克森

因此,我正在研究一个旨在在远程服务器上运行的项目。我在本地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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将带有const参数的C ++函数或C ++结构链接到D可执行文件?

来自分类Dev

无法链接到主可执行文件

来自分类Dev

Scons,仅从静态库构建C ++可执行文件

来自分类Dev

将可执行文件链接到第三方依赖的共享库时的C ++ CMake未定义引用

来自分类Dev

无法从ntfs格式化分区上的.c文件编译可执行文件

来自分类Dev

具有链接的C库的OCaml本机可执行文件

来自分类Dev

C ++链接器如何选择要链接到可执行文件的类的定义

来自分类Dev

Makefile:C中的“ ld:无法与主可执行文件链接”

来自分类Dev

GCC和binutils构建-C编译器无法创建可执行文件

来自分类Dev

Gycwin:C编译器无法创建可执行文件-tidalcycles安装

来自分类Dev

如何在主要可执行文件的子文件夹中部署Qt C ++共享库的dll?

来自分类Dev

C编译器无法创建可执行文件

来自分类Dev

配置:错误:C编译器无法创建可执行文件

来自分类Dev

使用LLVM构建Coreutils期间,C编译器无法创建可执行文件

来自分类Dev

无法从C ++启动可执行文件

来自分类Dev

buildozer-C编译器无法创建可执行文件

来自分类Dev

C编译器无法创建可执行文件

来自分类Dev

“ bash可执行文件”和“ bash -c可执行文件”之间的区别

来自分类Dev

在包含外部库的文件夹之外运行C#可执行文件

来自分类Dev

配置:错误:C编译器无法创建可执行文件

来自分类Dev

Linux上的C ++,确认库中的代码未静态链接到生成的可执行文件中

来自分类Dev

C#代码挖掘器可执行文件/类库项目不起作用

来自分类Dev

Scons,仅从静态库构建C ++可执行文件

来自分类Dev

为什么在Windows上不常见的做法是将可执行文件符号链接到C:\ Windows \ System32?

来自分类Dev

C ++可执行文件崩溃

来自分类Dev

在将共享库层次结构链接到可执行文件时,cmake链接错误

来自分类Dev

如何在主要可执行文件的子文件夹中部署Qt C ++共享库的dll?

来自分类Dev

C++ 模板的目标代码是否在可执行文件和动态库中重复?

来自分类Dev

cmake,无法运行与预编译共享库链接的可执行文件

Related 相关文章

  1. 1

    如何将带有const参数的C ++函数或C ++结构链接到D可执行文件?

  2. 2

    无法链接到主可执行文件

  3. 3

    Scons,仅从静态库构建C ++可执行文件

  4. 4

    将可执行文件链接到第三方依赖的共享库时的C ++ CMake未定义引用

  5. 5

    无法从ntfs格式化分区上的.c文件编译可执行文件

  6. 6

    具有链接的C库的OCaml本机可执行文件

  7. 7

    C ++链接器如何选择要链接到可执行文件的类的定义

  8. 8

    Makefile:C中的“ ld:无法与主可执行文件链接”

  9. 9

    GCC和binutils构建-C编译器无法创建可执行文件

  10. 10

    Gycwin:C编译器无法创建可执行文件-tidalcycles安装

  11. 11

    如何在主要可执行文件的子文件夹中部署Qt C ++共享库的dll?

  12. 12

    C编译器无法创建可执行文件

  13. 13

    配置:错误:C编译器无法创建可执行文件

  14. 14

    使用LLVM构建Coreutils期间,C编译器无法创建可执行文件

  15. 15

    无法从C ++启动可执行文件

  16. 16

    buildozer-C编译器无法创建可执行文件

  17. 17

    C编译器无法创建可执行文件

  18. 18

    “ bash可执行文件”和“ bash -c可执行文件”之间的区别

  19. 19

    在包含外部库的文件夹之外运行C#可执行文件

  20. 20

    配置:错误:C编译器无法创建可执行文件

  21. 21

    Linux上的C ++,确认库中的代码未静态链接到生成的可执行文件中

  22. 22

    C#代码挖掘器可执行文件/类库项目不起作用

  23. 23

    Scons,仅从静态库构建C ++可执行文件

  24. 24

    为什么在Windows上不常见的做法是将可执行文件符号链接到C:\ Windows \ System32?

  25. 25

    C ++可执行文件崩溃

  26. 26

    在将共享库层次结构链接到可执行文件时,cmake链接错误

  27. 27

    如何在主要可执行文件的子文件夹中部署Qt C ++共享库的dll?

  28. 28

    C++ 模板的目标代码是否在可执行文件和动态库中重复?

  29. 29

    cmake,无法运行与预编译共享库链接的可执行文件

热门标签

归档