为啥要为 c 和 c++ 使用 gcc 和 g++ 编译器驱动程序

Posted

技术标签:

【中文标题】为啥要为 c 和 c++ 使用 gcc 和 g++ 编译器驱动程序【英文标题】:why use gcc and g++ compiler drivers for c and c++为什么要为 c 和 c++ 使用 gcc 和 g++ 编译器驱动程序 【发布时间】:2018-04-17 08:45:43 【问题描述】:

我已经将一个项目移植到了 arm cortex M7 芯片上,并且第一次使用 makefile,我使用的是 gnu-gcc 编译器集合。

是否建议用gcc驱动编译“c”代码,用g++驱动编译“c++”(app)代码,然后链接。 c 代码都是低级(头文件)寄存器访问地址等,不包含函数(尚未)或附加源文件。

或者如果需要可以修改头文件以使用g++编译,我可以使用g++编译器编译所有内容。

我已经设置好了,所以 gcc 正在编译 c 文件,而 g++ 正在编译 c++ 和链接。

【问题讨论】:

使用 C 编译器编译 C 代码 — gcc。使用 C++ 编译器编译 C++ 代码 — g++。如果程序包含任何 C++ 代码,请与 C++ 编译器链接(并确保 main() 程序被编译为 C++ 代码)。如果都是 C,则与 C 编译器链接。如果代码实际上是双语的,我建议将其视为 C++,但没有硬性规定。 这不是火箭科学:用 C 编译器编译 C 代码,用 C++ 编译器编译 C++ 代码。 也许我应该说,头文件中唯一的代码是指针和宏的结构 @joeblogs:标题的内容只是结构,指针和宏在我看来没有区别。用 C 编译器编译 C 代码;使用 C++ 编译器编译 C++ 代码;如果系统中有 C++ 代码,则链接 C++ 编译器;只有在没有 C++ 代码的情况下才应该与 C 编译器链接。 可能重复:***.com/questions/172587/… 【参考方案1】:

gcc 和 g++ 之间的唯一区别是:

当驱动程序用于调用链接器时,g++ 会导致 libstdc++ 作为“stdlibs”的一部分进行链接,而 gcc 将仅链接 libc。 g++ 会将 .c、.h 和 .i 文件编译为 C++,除非指定了 -x 选项。

这两个驱动程序都将根据文件扩展名或命令行开关编译 C 或 C++。如果您仅调用编译器驱动程序进行编译并直接调用链接器 (ld),使用 gccg++ -x,则使用哪个没有区别。

同样,如果您为 C++ 代码调用 gcc 驱动程序并显式链接 stdlibc++,它也没有任何区别 - 只要您的 crt0.o 不是 C-only - C++ 运行时启动必须在 @ 之前调用全局静态构造函数987654326@) - 很可能已经是这样了。

来自documentation的权威词:

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 运行时启动代码。它是默认链接的(我记得),但可以为您的平台定制。但是,大多数情况下,您的平台特定工具链的默认 crt0.o 至少对于 C/C++ 环境就足够了——硬件初始化可能在其他地方。 这就是票。 g++ 是一个调用 GCC 并自动指定与 C++ 库的链接的程序。除非使用 -x,否则它将“.c”、“.h”和“.i”文件视为 C++ 源文件而不是 C 源文件。这个程序也是我所追求的,我以前读过它,但记不太清了。在预编译带有“.h”扩展名的 C 头文件以用于 C++ 编译时很有用。在许多系统上,g++ 也以 c++ 的名称安装。 @joeblogs :是的 - 我正在修改答案,以便在您输入时明确说明 - 抱歉。 @sanjivgupta:是的 - ***.com/questions/20047218/…

以上是关于为啥要为 c 和 c++ 使用 gcc 和 g++ 编译器驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

gcc和g++的区别解析

gcc和g++使用澄清

#ifdef 标志来区分 gcc 和 g++ 编译器? [复制]

gcc与g++:联系区别和命令

G++和GCC和C,C++有啥区别的

gcc/g++ 实战之编译过程