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.ocrt1.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++/ ldbehavior,因此我不会遇到问题(即使使用crt1.o!)myprogram...希望如此会持续 :)
谢谢大家的帮助,
干杯!
ld根本不使用.o文件的搜索路径- 您必须将完整路径传递给它(如您从手册中引用的示例)。所以不,没有办法改变它用来查找.o文件的搜索路径。
通常,ld不应直接调用 - 例如,您通常会调用gcc来进行链接。我会说这是程序调用ld这里有问题。
| 归档时间: |
|
| 查看次数: |
10070 次 |
| 最近记录: |