为什么要使用gcc和g++编译器驱动程序来编译C和C ++?

3
我已经将一个项目移植到了arm cortex M7芯片上,并且第一次使用makefile,我正在使用gnu-gcc编译器集合。
是否建议使用gcc驱动程序编译"c"代码,使用g++驱动程序编译"c++"(应用)代码,然后进行链接。c代码全部都是低级别的(头文件)寄存器访问地址等,不包含任何函数(但还有源文件)。
或者如果需要,是否可以使用g++编译器编译所有内容,只要头文件可以修改为与g++兼容即可。
我已将其设置为gcc编译c文件,g++编译c++并进行链接。

1
使用C编译器(即gcc)编译C代码。使用C++编译器(即g++)编译C++代码。如果程序包含任何C++代码,则链接到C++编译器(并确保将main()程序编译为C++代码)。如果全部是C,则链接到C编译器。如果代码实际上是双语的,建议将其视为C++处理,但这并没有硬性规定。 - Jonathan Leffler
2
这并不是什么高深的学问:用C编译器编译C代码,用C++编译器编译C++代码。 - Lundin
也许我应该说,头文件中唯一的代码是指针结构和宏。 - joe blogs
@joeblogs:头文件的内容只包含结构体、指针和宏,我看不出有什么区别。使用C编译器编译C代码;使用C++编译器编译C++代码;如果系统中有任何C++代码,则使用C++编译器进行链接;只有在没有C++代码时才应该使用C编译器进行链接。 - Jonathan Leffler
可能重复:https://dev59.com/a3VC5IYBdhLWcg3w1Exq - Clifford
1个回答

5
gcc和g++之间的唯一区别在于:
- 当使用驱动程序调用链接器时,g ++会将libstdc ++作为“stdlibs”的一部分链接,而gcc仅链接libc。 - g ++将.c,.h和.i文件编译为C ++,除非指定了-x选项。
两个驱动程序都将根据文件名扩展名或命令行开关来编译C或C ++。如果您仅为编译调用编译器驱动程序并直接调用链接器(ld),则使用gcc或g ++ -x没有区别。
同样,如果您为C ++代码调用gcc驱动程序并显式链接stdlibc ++,那么也没有区别,只要您的crt0.o不仅限于C- C ++运行时启动必须在main()之前调用全局静态构造函数)-这很可能已经是实际情况。 文档中的权威说法:

3.3 编译 C++ 程序

C++ 源文件通常使用以下后缀之一:‘.C’、‘.cc’、‘.cpp’、‘.CPP’、‘.c++’、‘.cp’ 或 ‘.cxx’;C++ 头文件通常使用 ‘.hh’、‘.hpp’、‘.H’ 或(对于共享模板代码)‘.tcc’;预处理的 C++ 文件使用后缀 ‘.ii’。GCC 会识别这些文件名并将它们编译为 C++ 程序,即使你像编译 C 程序一样调用编译器(通常使用 gcc 命令)。

然而,使用 gcc 并不会添加 C++ 库。g++ 是一个调用 GCC 的程序,并自动指定链接到 C++ 库。它会将 ‘.c’、‘.h’ 和 ‘.i’ 文件视为 C++ 源文件,而不是 C 源文件,除非使用 -x 选项。当预编译带有 ‘.h’ 扩展名的 C 头文件以供 C++ 编译时,此程序也很有用。在许多系统中,g++ 也被安装为 c++ 命令。

编译 C++ 程序时,你可以指定许多与任何语言编译相同的命令行选项;或者指定对 C 和相关语言有意义的命令行选项;或者指定仅对 C++ 程序有意义的选项。请参见“控制 C 语言方言的选项”以了解与 C 相关的语言选项的说明。请参见“控制 C++ 语言方言的选项”以了解仅对 C++ 程序有意义的选项的说明。

如果您只想使用一个编译器,我建议您使用gcc,并单独调用链接器或显式链接-libstdc++。这样,编译模式将取决于文件名扩展名。使用“g++ -x”编译C代码只会导致混淆。

crt0.o是从crt0.s生成的目标代码 - 它是您平台的C运行时启动代码。它默认链接(我记得),但可以根据您的平台进行定制。然而,对于C/C++环境,大多数情况下您平台特定的工具链的默认crt0.o将足够使用 - 硬件初始化可能在其他地方。 - Clifford
1
这就是所需之物。g++ 是一个调用 GCC 并自动指定链接到 C++ 库的程序。它将 '.c'、'.h' 和 '.i' 文件视为 C++ 源文件,而不是 C 源文件,除非使用 -x。当预编译具有 '.h' 扩展名的 C 头文件以供 C++ 编译时使用时,此程序也很有用。在许多系统上,g++ 也安装为 c++ 的名称。 - joe blogs
@joeblogs:是的 - 当你在打字时,我正在修改答案以澄清这一点 - 抱歉。 - Clifford
@sanjivgupta:是的 - https://dev59.com/bGIj5IYBdhLWcg3wpWhx - Clifford

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