使用gcc和g++进行链接有什么区别吗?

9

gcc和g++之间的链接过程有什么区别吗?

我有一个大型C项目,我刚刚将其中一部分代码切换到了C ++。该代码尚未使用std C ++库,因此现在不需要-llibstdc ++


我曾认为gcc和g++都只是调用链接器(在我的系统上称为ld),因此不会有任何区别。但是,由C编译器或C ++编译器生成的目标文件存在差异。 - quamrana
可能是重复问题 https://dev59.com/pm025IYBdhLWcg3wsIIU#5854712 - Johan Lundberg
@JohanLundberg 哈哈,你有没有仔细阅读问题? - Šimon Tóth
@JohanLundberg 不正确。请看采纳的答案和附带的评论。 - Šimon Tóth
据我理解并阅读了man页面和答案,我所说的是正确的。我认为除了选择正确的语言和正确的库之外,没有更多的内容了。也就是说,显然C和C++之间存在差异,但对于C ++而言,使用g ++和gcc -llibstdc ++(您可以在具有C ++识别文件名的文件上或通过指定它是C ++来获得C ++,例如-std = some_C ++ standard_you_need)是相同的。 - Johan Lundberg
显示剩余3条评论
3个回答

7
主要区别在于(假设文件被检测为C++),g++会设置与C++标准库链接所需的标志。它还可能设置异常处理。我不会仅仅因为应用程序没有使用标准库就依赖于编译为C++时不需要它(例如默认异常处理程序)。
编辑:正如评论中指出的那样,对于任何静态对象的构造函数也会有问题,同时也无法获得虚函数表(因此,如果您正在使用这些C++功能,则仍需要链接该库)。
编辑2:除非您在C项目中使用C99特定的代码,否则我实际上会将整个项目编译为C++作为迁移过程的第一步。

2
不要忘记使用构造函数和析构函数初始化static和全局对象;它们的魔法在启动例程中,只有在C++模式下链接才能生效。 - Fred Foo
嗯,如果我有像 main.creal_code.cpp 这样的东西,该怎么办呢?是 gcc -c main.cg++ -c real_code.cpp,然后 g++ real_code.o main.o 吗? - Šimon Tóth
请问您能否澄清一下“它也可以设置异常处理”是什么意思?并且,明确一下,您的意思是gcc -llibstdc++和g++是不同的吗?我的g++手册只是说g++是一个调用GCC的程序,将.c、.h和.i文件视为C++源文件而不是C源文件(除非使用-x选项),并自动指定链接到C++库。 - Johan Lundberg
多态性的支持肯定是由G++添加的,而不是GCC C链接器所具备的。C链接器可以链接不包含虚方法的简单C++代码,但是您需要G++来支持虚方法(以及异常和其他一些东西)。我在尝试为PSoC微控制器编译C++时发现了这一点,请参阅此页面http://mbedded.ninja/programming/microcontrollers/psoc/using-cplusplus-with-psoc-creator。 - gbmhunter

0

gccg++ 都只是调用其他程序的驱动程序,不会做任何其他事情,因此您可以使用-v选项查看它们所做的确切操作,以及它们用什么参数调用其他程序。因此,您可以查看使用特定版本和体系结构的gcc使用gccg++进行链接的区别。但是,如果要实现可移植性,则不能指望这种情况保持不变。

根据您的需求,您可能还对-###参数感兴趣。


-2

我认为g++链接器将寻找CPP编码的函数名称,这与C语言不同。我不确定gcc是否能够处理这种情况。(只要您可以明确使用C版本而不是C++版本)。

编辑:

如果您有

extern "C" {
<declarations of stuff that uses C linkage>
}

在你的代码中,对象文件已经使用g++ -c编译。但我不敢打赌。


2
抱歉,但您并不知道自己在说什么。 - Šimon Tóth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接