据说linux loader是/ usr/bin/ld,但通常我们使用gcc/g ++来链接库和可执行文件,我们几乎不使用“ld”。“gcc链接”和“ld链接”之间有什么关系?
我最后一次用“LD”当我学习linux装配手动为,以生成可执行的唯一方法是LD .o文件生成可执行的情况下直接任意库。
我的问题是,是包含“LD”的一些功能包装GCC/G ++,因为原始的“LD”是太难用?或者我们不应该明确地使用“ld”作为c/C++程序链接,因为blablabla?
非常感谢。
据说linux loader是/ usr/bin/ld,但通常我们使用gcc/g ++来链接库和可执行文件,我们几乎不使用“ld”。“gcc链接”和“ld链接”之间有什么关系?
我最后一次用“LD”当我学习linux装配手动为,以生成可执行的唯一方法是LD .o文件生成可执行的情况下直接任意库。
我的问题是,是包含“LD”的一些功能包装GCC/G ++,因为原始的“LD”是太难用?或者我们不应该明确地使用“ld”作为c/C++程序链接,因为blablabla?
非常感谢。
gcc提供了几个默认选项ld
。
ld
不知道C++,或其他任何语言的任何东西。 ld
不知道你的代码需要链接什么库。如果您尝试直接将编译后的C++代码与ld链接起来,它将会帮助您,因为ld
本身并不知道它在哪里可以找到gcc的C++运行时库libstdc++
。你使用字符串吗?引导?其中大部分是作为对象模块的一部分进行编译的模板代码。但是还有一些预编译位在libstdc++
之内,需要与之链接。
当你给gcc编译的代码链接时,gcc会有礼貌地把你的所有文件一起传递给ld
,并告诉ld
除了你明确指定的那些库之外,哪些库。
你可以直接链接ld
,如果你愿意,只要你指定相同的库和链接选项gcc
使用。但你为什么要这么做?只需使用gcc链接你的gcc编译的代码。
我的问题是,是包含 “LD”
这是正确的一些功能包装GCC/G ++。
,因为原始的 “LD” 是太难用?
嗯,不是真的;你可以自己使用它,但也不会太麻烦,但是通过一个可执行文件,一组标志以及一个命令来管理整个构建过程是很方便的。
如果你绕过了包装器(尽管我没有测试过),你也可能必须自己提供一些运行时库(例如libstdC++。a)的绝对路径。
或者我们不应该明确地使用“ld”作为c/C++程序链接,因为blablabla?
你可以自由地做,如果你想要的。人们可能会扬眉吐气的唯一原因是问你为什么不按传统方式做。如果您有充分的理由直接调用ld
,而不是通过g++
并通过任何链接器标志,那就马上行动吧!
您不应该尝试直接使用ld
来链接C++程序,因为您需要知道C++运行时库静态部分所在位置的实现细节。 g++
知道这些实现细节,例如在哪里可以找到文件libstdc++.a
。如果您试图直接使用ld
,则必须提供所有这些“缺失”的静态库。
你的意思是,即使我们默认使用libstdC++,那么libstdC++里面仍然有一些内容被静态链接到我们的可执行文件中?这些内容在做什么?谢谢。 – Troskyvs
另请参阅[当我应该使用ld而不是gcc?](http://stackoverflow.com/q/36680470),[将C++代码与'gcc'(不含g ++)](http:// stackoverflow。 com/q/1001535)和朋友。 – jww