我想知道什么时候我应该使用ld
链接器而不是关闭gcc
。
我只是用c++写了一个简单的hello world,当然我包含了iostream
库。如果我想用gcc
创建一个二进制文件,我只需要用途:g++ hello hello.cpp
,我得到了二进制文件。
后来我尝试使用ld
链接器。要获取目标文件,我用途:g++ -c hello.cpp
.好吧,这很简单,但是link命令太长了:
ld -o hello.out hello.o \
-L /usr/lib/gcc/x86_64-linux-gnu/4.8.4/ \
/usr/lib/gcc/x86_64-linux-gnu/4.8.4/crtbegin.o \
/usr/lib/gcc/x86_64-linux-gnu/4.8.4/crtend.o \
/usr/lib/x86_64-linux-gnu/crti.o \
/usr/lib/x86_64-linux-gnu/crtn.o \
/usr/lib/x86_64-linux-gnu/crt1.o \
-dynamic-linker /lib64/ld-linux-x86-64.so.2 -lstdc++ -lc
我知道gcc
使用ld
的事实。使用gcc
是在所有情况下更好,还是只是在大多数情况下更好?请告诉我一些ld
链接器有优势的情况。
2条答案
按热度按时间busg9geu1#
正如你提到的,GCC只是在链接时充当LD的前端;它传递所有的链接器指令(选项、默认/系统库等),并通过为您处理所有这些特定于工具链的细节来确保所有内容都很好地结合在一起。
我相信最好把GNU工具链看作一个整体,紧密集成的环境(任何有过为一些外来的嵌入式平台构建工具链的经验的人,比如说dietlibc集成,可能都会同意)。
除非您有一些非常具体的平台集成需求,或者有不使用gcc的理由,否则我很难想到直接调用
ld
进行链接有什么好处。您可能需要的任何额外的特定于链接器的选项都可以很容易地在gcc命令行上使用-Wl,
前缀指定(如果还没有作为普通gcc选项提供)。koaltpgm2#
这主要是一个品味的问题:当命令行比
gcc
简单时,您可以直接使用ld
。这是当你只是使用链接器来操作少量的共享对象时,例如,创建一个具有很少依赖关系的共享库。因为可以通过
-Wl
选项将选项传递给ld
,所以人们通常会建议只使用gcc
来管理命令行。