如何配置我的环境以使用正确的(与系统版本不同的)库版本

如何配置我的环境以使用正确的(与系统版本不同的)库版本

我猜这个问题是 ServerFault 和 StackOverflow 以及此站点之间的边界问题。但我认为 U&L 最相关。

我有一些C++代码依赖于版本中的库X,并且系统提供了版本Y(X>Y)。我已经编译了这个库并将生成的文件放入/opt/lib_name/X/lib,版本Y安装在/usr/lib64.我想链接到so库。

现在我想创建一些以某种方式启用 version 的脚本X,因此我构建的任何代码gcc都会针对 version 进行编译,X而无需对 makefile 进行任何更改。

现在我设置了LIBRARY_NAME_DIR变量,并在 makefile 中附加了它-L $LIBRARY_NAME_DIR,它可以工作,但需要我更改 makefile。

有什么方法可以在没有计算机 root 访问权限的情况下执行此类操作。

注意:虽然我相信这个问题的答案并不取决于特定的库或代码,但我的特定问题的所有详细信息都在这里:https://stackoverflow.com/q/24189130/7918

我尝试过的:

  • 我已经设定:LIBRARY_PATHLD_LIBRARY_PATHCPLUS_INCLUDE_PATH

答案1

我认为没有任何方法可以纯粹通过环境变量来稳健地做到这一点。使用的问题LIBRARY_PATH似乎是任何给定的-L选项都有优先权。如果由于任何原因gcc命令有-L/usr/lib64,将首先搜索该命令,然后找到旧版本的库。看起来你要更改Makefiles,你还应该注意a-L/usr/lib64不会首先出现。

不过,看看你的问题,上面的问题似乎不是问题。但是,变量:的值有不必要的尾随LIBRARY_PATH,这可能可以解释为什么它不起作用。

另外,正如 SO 问题的答案中所指出的,LD_LIBRARY_PATH由动态链接器使用,并且仅在以下位置相关:运行为您的应用程序。如果应用程序运行时找不到动态库的位置,则可以使用此方法。 GNU 链接器使用的是LD_RUN_PATH,它基本上执行for 的-rpath操作,除了指定将被忽略的任何手段(而不仅仅是给予较低的优先级)。LIBRARY_PATH-rpath-rpathLIBRARY_PATH

那么你可以尝试的是:

LIBRARY_PATH=/opt/lib_name/X/lib LD_RUN_PATH=/opt/lib_name/X/lib make

可能更强大的方法是创建一个gcc包含必要选项的包装脚本,例如:

#!/bin/sh
gcc -L/opt/lib_name/X/lib -Wl,-rpath,/opt/lib_name/X/lib "$@"

将文件命名为gcc,使其可执行并将其单独放入一个目录中(或者至少放在一个不存在与重要命令同名的文件的目录中)。然后你可以make像这样运行:

PATH=/path/to/script:$PATH make

相关内容