我什么时候应该使用 ld 而不是 gcc?

When i should use ld instead of gcc?

我想知道什么时候应该使用 ld linker 而不是 gcc。我只是用 C++ 写了一个简单的 hello world,当然我包括了 iostream 库。如果我想用 gcc 创建一个二进制文件,我只需要使用:

g++ hello hello.cpp 我有我的二进制文件。

后来我尝试使用ld linker。要获取目标文件,我使用: 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 linker 有优势的情况。

正如您所提到的,gcc 在 link 时仅充当 ld 的前端;它传递了所有 linker 指令(选项、default/system 库等),并通过处理所有这些 特定于工具链的 [=19] 来确保一切都很好地组合在一起=] 详情给你。

我认为最好将 GNU 工具链视为一个整体,紧密集成的环境(因为任何具有为某些奇特的嵌入式平台构建工具链的经验的人,例如,集成 dietlibc 的人可能会同意)。

除非您有一些非常具体的平台集成要求,或者有不使用 gcc 的理由,否则我几乎想不出为 linking 直接调用 ld 有什么好处。您可能需要的任何额外的 linker-specific 选项都可以在 gcc 命令行上使用 -Wl, 前缀轻松指定(如果还没有作为普通 gcc 选项提供)。

这主要是个人喜好问题:当命令行比使用 gcc 更简单时,您会直接使用 ld。那就是当您只是使用链接器来操作少量共享对象时,例如,创建一个几乎没有依赖项的共享库。

因为您可以通过 -Wl 选项将选项传递给 ld,所以通常人们会建议只使用 gcc 来管理命令行。