我想这个问题是ServerFault和*与本网站之间的界限.但我认为U& L最相关.
我有一些C代码依赖于版本X中的库,系统提供版本Y(X> Y).我已编译此库并将结果文件放入/ opt / lib_name / X / lib,版本Y安装在/usr/lib64中.我想链接反对这样的库.
现在我想创建一些以某种方式启用版本X的脚本,因此我使用gcc构建的任何代码都是针对版本X编译的,而makefile中没有任何更改.
现在我设置了LIBRARY_NAME_DIR变量,在makefile中我只是追加-L $LIBRARY_NAME_DIR,它可以运行但需要我更改makefile.
如果没有root权限访问计算机,有没有办法做这类事情.
注意:虽然我认为这个问题的答案不依赖于特定的库或代码,但我特定问题的所有细节都在这里:https://*.com/q/24189130/7918.
我尝试过的:
>我已设置:LIBRARY_PATH,LD_LIBRARY_PATH,CPLUS_INCLUDE_PATH.
解决方法:
我认为没有任何办法可以完全用环境变量做到这一点.使用LIBRARY_PATH的问题似乎是任何给定的-L选项都有优先权.如果由于任何原因gcc命令具有-L /usr/lib64,则将首先搜索该文件,并找到该库的旧版本.看起来你要改变Makefile,你也应该注意首先不出现-L /usr/lib64.
但是,看看你的SO问题,看起来上面的问题并不像是一个问题.但是,有一个不必要的尾随:LIBRARY_PATH变量的值,这可能解释了为什么它不起作用.
此外,如SO问题的答案中所述,LD_LIBRARY_PATH由动态链接器使用,并且仅在运行时与您的应用程序相关.如果在运行应用程序时找不到动态库的位置,则可以使用此方法. GNU链接器使用的是LD_RUN_PATH,它基本上用于-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