我想知道何时应该使用ld链接器代替gcc。我刚用c ++写了一个简单的hello world,当然我包含了iostream库。如果我想用gcc制作一个二进制文件,我只需使用:
g++ hello hello.cpp
我已经得到了我的二进制文件。
后来我尝试使用ld链接器。要获取目标文件我使用:
g++ -c hello.cpp
。好吧,这很容易,但链接命令很长很长:
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链接器有优势的案例的一些想法。
答案 0 :(得分:8)
正如你所提到的,gcc在链接时只是作为ld的前端;它传递所有链接器指令(选项,默认/系统库等),并通过为您处理所有这些工具链特定的细节,确保所有内容完美地结合在一起。
我认为最好将GNU工具链视为一个整体,紧密集成的环境(因为任何具有为某些奇特嵌入式平台构建工具链的经验的人,例如,Dietlibc集成可能会同意)。
除非你有一些非常具体的平台集成要求,或者有理由不使用gcc,否则我很难想到直接调用ld
进行链接的任何好处。您可能需要的任何额外的特定于链接器的选项都可以使用gcc命令行中的-Wl,
前缀轻松指定(如果尚未作为普通gcc选项提供)。
答案 1 :(得分:3)
这主要是品味问题:当命令行比使用ld
更简单时,您可以直接使用gcc
。那就是当您只是使用链接器来操作少量共享对象时,例如,创建一个具有很少依赖性的共享库。
由于您可以通过ld
选项将选项传递给-Wl
,因此人们通常会建议您只使用gcc
来管理命令行。