加载共享库时出错

rah*_*hmu 5 c gentoo linker dynamic-linking

我的项目树看起来像这样:

src/
include/
Makefile
lib/
   lib/3rdparylib/
Run Code Online (Sandbox Code Playgroud)

我没有编写代码3rdpartylib,但决定将其源代码嵌入到我的项目打包中。我通过执行以下步骤来编译软件:

$ cd lib/3rdpartylib/
$ make
$ ln -s 3rdpartylib.so.0 3rdpartylib.so
Run Code Online (Sandbox Code Playgroud)

然后我编译每个的我的源文件是这样的:

$ gcc -c src/file.c -I include -o file.o -l 3rdparylib -L lib/3rdpartylib -I lib/3rdpartylib/include
Run Code Online (Sandbox Code Playgroud)

然后我链接:

$ gcc file1.o file2.o -l3rdpartylib -L lib/3rdpartylib -o myapp
Run Code Online (Sandbox Code Playgroud)

当我在我的主机上时,它运行良好。今天我试图在另一台机器上启动它。它编译和链接没有任何问题。但是,当我尝试启动该应用程序时,我收到以下错误消息。

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

我尝试执行以下操作:

export LD_LIBRARY_PATH=/path/to/3rdpartylib.so
Run Code Online (Sandbox Code Playgroud)

它似乎工作。但我知道使用 LD_LIBRARY_PATH 是一种不好的做法。每次我想运行我的应用程序时都设置这个变量让我很困扰。

我错过了什么?为什么它在我的主机上工作(其中 LD_LIBRARY_PATH 没有设置为任何东西)而不是在另一台机器上?另一台机器是虚拟机有关系吗?

如果有任何帮助,我的主要机器是 Debian 机器,而我的“新”机器是 Sabayon(Gentoo),在 Virtualbox 中运行。

roz*_*acz 4

重要的是每台机器使用什么 Linux 发行版,因为它们处理库路径的方式不同。在 Gentoo (Sabayon) 机器上,如果您希望第三方库在系统范围内可用,您应该:

  • 在该文件下创建一个文件,/etc/env.d/其中将包含附加环境设置。这些文件使用该方案命名[0-9][0-9]somename- 两个初始数字决定它们的使用顺序。一个好的实践要求您的自定义设置(接近)添加到最后,所以99只要它有效,这就是一个正确的开始。进入正题:创建一个名为的文件

    /etc/env.d/99mythirdpartylib
    
    Run Code Online (Sandbox Code Playgroud)

    含有

    LDPATH=/path/to/your/library
    
    Run Code Online (Sandbox Code Playgroud)
  • 要使更改生效而无需重新启动,请以 root 身份运行:

    env-update && source /etc/profile
    
    Run Code Online (Sandbox Code Playgroud)

    (这将更新环境并运行ldconfig)。

想要的话可​​以参考一下。