我猜这个问题是 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_PATH
,LD_LIBRARY_PATH
,CPLUS_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
-rpath
LIBRARY_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