" gcc链接"之间的关系是什么?并且" ld链接"?

时间:2016-12-29 01:47:32

标签: c++ linux gcc ld

它说linux加载器是/ usr / bin / ld,但通常我们使用gcc / g ++链接库和可执行文件,我们几乎不使用" ld"。

我最后一次使用" ld"手动是当我学习linux程序集时,生成可执行文件的唯一方法是ld .o文件直接生成可执行文件而不需要任何库。

我的问题是,gcc / g ++包含" ld"的一些函数包装器,因为raw" ld"难以使用?或者我们永远不应该使用" ld"显式用于c / c ++程序链接,因为blablabla?

非常感谢。

3 个答案:

答案 0 :(得分:7)

gcc为ld提供了一些默认选项。

ld对C ++或任何其他语言一无所知。 ld不知道您的代码需要链接哪些库。如果你试图直接将已编译的C ++代码与ld链接起来,那么它将会拯救你,因为ld本身并不知道它在哪里找到libstdc++,即gcc的C ++运行时库。你用字符串吗?引导?其中大部分是模板代码,它被编译为对象模块的一部分。但是在libstdc++中仍然有一些需要链接的预编译位。

当您将已编译的代码提供给gcc进行链接时,gcc将足够有礼貌地将您的所有文件传递到ld,并告诉ld除了您明确指定的任何库之外的哪些库

如果您愿意,可以直接与ld链接,只要您指定相同的库和gcc使用的链接选项即可。但是你为什么要那样做呢?只需使用gcc链接你的gcc编译的c ode。

答案 1 :(得分:2)

  

我的问题是,gcc / g ++是否包含“ld”

的一些函数包装器

没错。

  

因为原始的“ld”难以使用?

嗯,不是真的;您可以自己使用它而不会出现太多麻烦,但通过单个可执行文件管理整个构建过程很方便,只需一个标记套件,并且通常只需一个命令。

如果您绕过包装器(尽管我没有对此进行测试),您也可能必须自己提供一些运行时库(例如libstdc ++。a)的绝对路径。

  

或者我们不应该明确地使用“ld”进行c / c ++程序链接,因为blablabla?

如果你愿意,你可以自由地这样做。人们可能会抬起眉毛的唯一原因就是问你为什么不以传统的方式做这件事。如果你有充分的理由直接调用ld,而不是通过g++并通过这种方式传递任何链接器标志,那么就去吧!

答案 2 :(得分:2)

您不应尝试直接使用ld链接C ++程序,因为您需要了解C ++运行时库的静态部分所在位置的实现细节。 g++知道这些实现细节,例如在哪里找到文件libstdc++.a。如果您尝试直接使用ld,则必须提供所有这些“缺失”的静态库。