代码之家  ›  专栏  ›  技术社区  ›  Paul Wicks asgeo1

为什么每次运行应用程序时都要用导出定义ld_library_路径?

  •  41
  • Paul Wicks asgeo1  · 技术社区  · 16 年前

    我有一些代码使用一些共享库(GCC上的C代码)。编译时,我必须使用-i和-l明确定义include和library目录,因为它们不在标准位置。当我尝试运行代码时,我得到以下错误:

    ./sync_test 
    ./sync_test: error while loading shared libraries: libsync.so: cannot open shared object file: No such file or directory
    

    但是,执行以下操作,一切正常:

    export LD_LIBRARY_PATH="/path/to/library/"
    ./sync_test
    

    奇怪的是,这只起作用一次。如果我再次尝试运行同步测试,除非先运行export命令,否则会得到相同的错误。我尝试将以下内容添加到.bashrc中,但没有任何区别:

    LD_LIBRARY_PATH="/path/to/library/"
    
    7 回复  |  直到 8 年前
        1
  •  42
  •   user JaredPar    11 年前

    使用

    export LD_LIBRARY_PATH="/path/to/library/"
    

    在您的.bashrc中,否则它只能用于bash,而不能用于启动任何程序。

    尝试 -R/path/to/library/ 当您链接时,它将使程序在该目录中查找,并且您不需要设置任何环境变量。

    编辑:看起来像 -R 仅限Solaris,而且您使用的是Linux。

    另一种方法是将路径添加到 /etc/ld.so.conf 并运行 ldconfig . 请注意,这是一个全局更改,将应用于所有动态链接的二进制文件。

        2
  •  44
  •   miller Jeffrey Blattman    10 年前

    你应该避免设置 LD_LIBRARY_PATH 在你 .bashrc . 见 " Why LD_LIBRARY_PATH is bad " 更多信息。

    使用链接器选项 -rpath 同时链接,以便动态链接器知道在何处查找 libsync.so 在运行时。

    gcc ... -Wl,-rpath /path/to/library -L/path/to/library -lsync -o sync_test
    

    编辑:

    另一种方法是使用这样的包装器

    #!/bin/bash
    
    LD_LIBRARY_PATH=/path/to/library sync_test "$@"
    

    如果 sync_test 启动任何其他程序,它们可能最终会在 /path/to/library 可能是也可能不是有意的。

        3
  •  10
  •   bedwyr    16 年前

    你在你的.bashrc中“导出”了吗?

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/path/to/library"
    
        4
  •  10
  •   unwesen    16 年前

    你可以把这些都放在一行上:

    LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library" ./sync_test
    

    应该让事情变得简单一点,即使它不会改变任何基本的东西

        5
  •  4
  •   fgp    12 年前

    不是在运行时用ld_library_path覆盖库搜索路径,而是用 rpath . 如果你链接GCC添加 -Wl,-rpath,<libdir> 应该这样做,如果你链接到ld,它只是 -rpath <libdir> .

        6
  •  2
  •   Roalt    16 年前

    如果您在系统上安装了共享库,您还可以将包含共享库的目录添加到 /ETC/LD.SO.CONF 文件,或在中生成新文件 /etc/ld.so.conf.d.等/ld.so.conf.d/

    (我已经检查了rhel5和ubuntu发行版,所以我认为它是Linux的通用版本)

    ldconfig程序将确保它们包含在系统范围内。

    有关详细信息,请参阅以下链接: www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/dlls.html

        7
  •  1
  •   Rick Smith Robert Truitt    8 年前

    您可以在代码中添加具有新定义的呼叫系统:

    sprintf(newdef,"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:%s:%s",ld1,ld2);
    system(newdef);
    

    但是,我不知道这是第三个解决方案,但它起作用了。

    当做