我想知道为什么
g++ test1.o test2.o -o test.x -lgtk-x11-2.0
有效,而
ld 'r test1.o test2.o -o test.o -lgtk-x11-2.0
给出:
ld: cannot find -lgtk-x11-2.0
除非我明确包含添加-L/usr/lib/i386-linux-gnu
我尝试了添加$LD_LIBRARY_PATH
或ld.so.conf
路径的所有内容,但没有任何效果,我无法解释两次调用之间的区别。
在ld的手册中指定:
搜索的默认路径集(未指定为“-L”)取决于ld正在使用的仿真模式,在某些情况下还取决于它的配置方式
但尝试不同的模拟(通过使用-m * emulation *)意味着segfaulting(可能是因为默认模拟elf_i386,是正确的模拟)。
你能帮助我阐明一下这个话题吗?
答案 0 :(得分:1)
gcc -print-search-dirs
(或g++
)显示编译器使用的库搜索路径; /usr/lib/i386-linux-gnu
可能是内置的。此选项通过gcc传递给链接器,但不是内置于链接器。
尝试添加-v
:g++ -v test1.o test2.o -o test.x -lgtk-x11-2.0
看看如何调用链接器。
答案 1 :(得分:1)
如果您对ld
ld --verbose | grep SEARCH
通常您不希望明确地使用ld
进行链接,单独使用gcc
执行每项任务可能会更好,而您应该优先选择后者而不是前者。
如果您想了解有关gcc
设置
gcc -dumpspecs
让你体会一下,看看gcc
的内部结构是什么感觉,如果你认真对待这个问题,你最终可能会看一下gcc
手册,但是我不要认为这只是为了它而做的事情。
编译gcc
时定义的设置也很重要,因此如果您真的想了解内部的工作原理,还应该学习如何从源代码编译gcc
。
TL;博士
只需使用gcc
进行编译和链接,其他选项可能不值得。