【问题标题】:Linking with a different .so file in linux在linux中链接不同的.so文件
【发布时间】:2010-11-27 03:58:05
【问题描述】:

我正在尝试编译一个具有标准构建过程的软件,例如

configure
make
make install

该软件需要一个库,例如libreq.so 安装在 /usr/local/lib 中。但是,我的问题是我想构建该软件并将其与安装在 /home/user/mylibs 中的同一库的不同版本(我也有该库的源代码)链接。

我的问题是,如何针对 /home/user/mylibs 中的库而不是 /usr/local/lib 中的库编译和链接软件

我尝试将“LD_LIBRARY_PATH”设置为包含 /home/user/mylibs,但没有奏效。

谢谢!

【问题讨论】:

    标签: linux build-process


    【解决方案1】:

    当您有 autoconf 配置脚本时,使用:

    CPPFLAGS=-I/home/user/include LDFLAGS=-L/home/user/mylibs ./configure ...
    

    这会将指定目录添加到搜索标题的目录列表中(通常在使用库时需要),并将另一个指定目录添加到搜索实际库的列表中。

    我一直都在使用它——在我的工作机器上,/usr/local 由 MIS“维护”,并且 99.9% 的时间都包含过时的代码(并且是 NFS 安装的,只读的),所以我很难避免完全使用它并在/usr/gnu 下维护我自己的、更接近最新的软件版本。它对我有用。

    【讨论】:

      【解决方案2】:

      尝试将LD_PRELOAD 设置为您的实际文件。

      【讨论】:

      • 谢谢,但这似乎并没有在构建过程中覆盖 /usr/local/lib 版本,有没有我可以传递给 configure 的参数来告诉它使用特定的库地点?
      【解决方案3】:

      LD_LIBRARY_PATH 用于在运行时查找动态链接库。在编译时,您应该将 -L 参数添加到 gcc/g++ 以指定 *.so 文件所在的目录。您还需要使用 -l 添加库名称(其中库为 libNAME.so)。

      重要!要进行链接,您不仅需要 libNAME.so 文件,还需要 libNAME.a。

      运行应用程序时,不要忘记将目录添加到 LD_LIBRARY_PATH。

      【讨论】:

      • @ 重要!要进行链接,您不仅需要 libNAME.so 文件,还需要 libNAME.a 文件。 -> 你不是在说windows(.dll + .lib)吗? .a 是静态库,根本不需要。
      【解决方案4】:

      当您将/home/user/mylibs 添加到 LD_LIBRARY_PATH 时,您是将它添加到现有路径的前面还是末尾?令牌是按顺序搜索的,因此您希望自己的令牌首先出现在列表中。

      此外,许多使用configure 的标准构建环境将允许您为每个所需的部分指定一个精确的库。您必须运行 ./configure --help,但您应该会看到类似 --using-BLAH-lib=/path/to/your/library 或类似的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-29
        相关资源
        最近更新 更多