【问题标题】:How to define where libs are loaded from如何定义从哪里加载库
【发布时间】:2011-05-28 18:04:56
【问题描述】:

我正在尝试使用 gcc 4.2.0 在 AIX 6.1 上编译omniORB。

初始化不起作用,因为它正在拾取非 pthread 库。

如果我将 LIBPATH 设置为 /opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.2.0/omniNames 将不起作用,因为流接口给出了异常。

将 LIBPATH 设置为 /opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.2.0/pthread 似乎可以工作,但其他非 pthread 程序会选择 pthreaded lib,这可能会导致问题...

链接如下:

g++ -o omniNames -O2 -Wall -Wno-unused -fexceptions -Wl,-brtl -Wl,-blibpath:/lib:/usr/lib:/opt/dbx/omniORB-4/lib -L../../../lib -L../../../../lib omniNames.o NamingContext_i.o log.o omniNamesWin.o -lomniORB4-ar -lomnithread34 -lpthreads

我该如何解决这个问题??

请注意,我曾尝试使用配置参数更改 libpath,但没有成功。

【问题讨论】:

    标签: c++ gcc aix


    【解决方案1】:

    通过正确设置 LIBPATH 的包装脚本启动可能是最简单的。

    然后是 ELF 的 RUNPATH/RPATH 特性,它允许在可执行文件中嵌入动态库的搜索路径;但我不知道 AIX 是否实现了它。它确实如此,并且使用与 Linux 和 Solaris 相同的参数进行设置,-Wl,--enable-new-dtags -Wl,-R$(RUNPATH) 用于 DT_RUNPATH,-Wl,--disable-new-dtags -Wl,-R$(RPATH) 用于 DT_RPATH;您可能还想简单地测试-Wl,-R$(RPATH)(这可能会设置DT_RPATH)。

    【讨论】:

      【解决方案2】:

      每个操作系统都使用自己独特的一组环境变量来决定在哪里搜索共享库。

      大多数类 UNIX 系统使用 LD_LIBRARY_PATH(但它会有所不同)。

      我发现找到要使用哪个环境变量的最有效方法是在您正在构建的平台上查看 dlopen() 的手册页。

      已编辑:还请注意,这些变量的作用类似于 PATH 环境变量,因为它们是由“:”分隔的路径列表。所以你能不能这样设置环境:

      # Using  tcsh syntax for setting environment. Your shell may very.
      setenv LIBPATH "/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.2.0/:/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.2.0/pthread"
      

      【讨论】:

      • AIX 使用 LIBPATH,而 SunOS 和 Linux 使用 LD_LIBRARY_PATH,而 HP-UX 使用 SHLIB_PATH(然后是 32 位和 64 位版本的复杂性)。我对 OP 问题的理解是,如果他将 LIBPATH 设置为某个值,那么对于某些程序来说是不正确的,如果他为这些程序更正它,那么对于其他程序来说现在是不正确的。
      【解决方案3】:

      AIX ld 手册页指出:

         Note: If you specify a shared object, or an archive file containing a
         shared object, with an absolute or relative path name, instead of with
         the -lName flag, the path name is included in the import file ID string
         in the loader section of the output file. You can override this
         behavior with the -bnoipath option.
      

      所以,只指定 /my/path/to/libfoo.so 而不是 -lfoo 应该会给你想要的行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-10
        • 1970-01-01
        • 1970-01-01
        • 2021-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多