sda*_*aau 6 linux search path object ld
好吧,情况就是这样:我正在尝试使用一些较旧的软件:在Ubuntu Lucid上工作正常,在Natty上失败.
所以,我strace
喋喋不休,事实证明这个软件调用ld
,并ld
最终失败:
.../ld: crt1.o: No such file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
...是的,旧的crti.o文件丢失错误:)但是,我想用更一般的术语提问...
问题是,这是"独立"(较旧)ld
,当我跑步时.../ld -verbose | less
,我得到:
...
SEARCH_DIR("/usr/local/lib");
SEARCH_DIR("/lib");
SEARCH_DIR("/usr/lib");
...
Run Code Online (Sandbox Code Playgroud)
现在,问题在于:
crt1.o
是在/usr/lib/crt1.o
crt1.o
是在/usr/lib/i386-linux-gnu/crt1.o
...所以,毫无疑问,为什么crt1.o
无法找到,我想.看来,我所要做的,就是告诉ld
寻找crt1.o
在/usr/lib/i386-linux-gnu
,但我怎么做呢?
我以为我可以使用该-L
选项,但是man ld
说:
to link a file "hello.o":
ld -o <output> /lib/crt0.o hello.o -lc
This tells ld to produce a file called output as the result of linking
the file "/lib/crt0.o" with "hello.o" and the library "libc.a", which
will come from the standard search directories.
...
-L searchdir
--library-path=searchdir
Add path searchdir to the list of paths that ld will search for
archive libraries and ld control scripts.
Run Code Online (Sandbox Code Playgroud)
......意思是' -L
'会影响我们寻找的位置" libc.a
"(在男人的例子中) - 但不会影响目标文件.
我实际上更喜欢这个环境变量,但我尝试了两个LD_PRELOAD_PATH
并且LD_LIBRARY_PATH
无济于事(我猜,那些与"共享对象"有关,而且这些.o
文件不是其中之一).
有没有人知道是否有一个环境变量(最好 - 如果不是,命令行选项ld
),它将控制ld
搜索.o
目标文件的位置?
作为一个说明,我想我可能只是符号链接/usr/lib/i386-linux-gnu/crt1.o
的/usr/lib/
,但我宁愿使用环境变量,如果存在的话...如果没有,是否有这个任何其他可能的解决方案?
提前感谢任何答案,
干杯!
好吧,经过一番搞砸之后,我想我设法解决了我原来的问题(尽管请注意,就原始问题而言,它仍然是与接受的答案相同的答案):
LIBRARY_PATH=/lib/i386-linux-gnu:/usr/lib/i386-linux-gnu:$LIBRARY_PATH myprogram --args..
Run Code Online (Sandbox Code Playgroud)
这是我应该记住的区别:
LD_LIBRARY_PATH
用于"帮助"可执行查找库文件,当它运行时(即加载LD_
)LIBRARY_PATH
帮助gcc
,g++
而公司发现通过"引用的库-l
"的说法(例如-ldl
,也就是说libdl
,这也是在我的情况的问题;看到man g++
更多关于LIBRARY_PATH
)所以,因为myprogram
正在调用g++
,ld
等等,并且那些崩溃无法在编译期间找到库 - 添加LIBRARY_PATH
参数似乎已经修复了g++
/ ld
behavior,因此我不会遇到问题(即使使用crt1.o
!)myprogram
...希望如此会持续 :)
谢谢大家的帮助,
干杯!
ld
根本不使用.o
文件的搜索路径- 您必须将完整路径传递给它(如您从手册中引用的示例)。所以不,没有办法改变它用来查找.o
文件的搜索路径。
通常,ld
不应直接调用 - 例如,您通常会调用gcc
来进行链接。我会说这是程序调用ld
这里有问题。