为什么对 c 和 c++ 使用 gcc 和 g++ 编译器驱动程序

joe*_*ogs 3 c c++ gcc g++

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

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

或者,如果需要的话可以修改头文件以使用 g++ 进行编译,我可以使用 g++ 编译器来编译所有内容吗?

我已设置它,以便 gcc 正在编译 c 文件,而 g++ 正在编译 c++ 并链接。

Cli*_*ord 5

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

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

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

\n\n

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

\n\n

文档中的明确说法:

\n\n
\n

3.3 编译C++程序

\n\n

C++ 源文件通常使用后缀之一 \xe2\x80\x98.C\xe2\x80\x99、\xe2\x80\x98.cc\xe2\x80\x99、\xe2\x80\x98.cpp\xe2\ x80\x99、\xe2\x80\x98.CPP\xe2\x80\x99、\xe2\x80\x98.c++\xe2\x80\x99、\xe2\x80\x98.cp\xe2\x80\x99 或\xe2\x80\x98.cxx\xe2\x80\x99;\n C++头文件经常使用\xe2\x80\x98.hh\xe2\x80\x99、\xe2\x80\x98.hpp\xe2\x80\ x99、\xe2\x80\x98.H\xe2\x80\x99 或(对于共享模板代码)\xe2\x80\x98.tcc\xe2\x80\x99;预处理的 C++ 文件使用后缀\n \xe2\x80\x98.ii\xe2\x80\x99。即使您以与编译 C\n 程序相同的方式调用编译器(通常使用名称 gcc),GCC 也会识别具有这些名称的文件并将它们编译为 C++\n 程序。

\n\n

不过,使用gcc并不会添加C++库。g++ 是一个调用 GCC 并自动指定与 C++ 库的链接的程序。它将 \xe2\x80\x98.c\xe2\x80\x99、\xe2\x80\x98.h\xe2\x80\x99 和 \xe2\x80\x98.i\xe2\x80\x99 文件视为 C++ 源files\n 而不是 C 源文件,除非使用 -x。当预编译带有 \xe2\x80\x98.h\xe2\x80\x99 扩展名的 C 头文件以便在 C++ 编译中使用时,此程序也很有用。在许多系统上,g++ 也以 c++ 名称安装。

\n\n

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

\n
\n\n

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

\n