1. C++程序的后缀
C++ 源文件的后缀则有些混乱,不同的编译器支持不同的后缀,下表是一个简单的汇总:
总结:从表中看出,除去UNIX系统,使用.cpp作为后缀比较方便。
2. gcc与g++指令
GCC 是由 GUN 组织开发的,最初只支持 C 语言,是一个单纯的 C 语言编译器,后来 GNU 组织倾注了更多的精力,使得 GCC 越发强大,增加了对 C++、Objective-C、Fortran、Java 等其他语言的支持,此时的 GCC 就成了一个编译器套件(套装),是所有编译器的总称。
在这个过程中,gcc
命令也做了相应地调整,它不再仅仅支持 C 语言,而是默认支持 C 语言,增加参数后也可以支持其他的语言。也就是说,gcc
是一个通用命令,它会根据不同的参数调用不同的编译器或链接器。
但是让用户指定参数是一种不明智的行为,不但增加了学习成本,还使得操作更加复杂,所以后来 GCC 又针对不同的语言推出了不同的命令,例如 g++
命令用来编译 C++,gcj
命令用来编译 Java,gccgo
命令用来编译 Go 语言。
总结:当不指定参数的时候,gcc
默认c语言源文件的编译指令,对于不同的语言,使用不同的编译指令。
在以后使用 Linux GCC 时,推荐使用 g++
命令来编译 C++ 程序,这样更加简洁和规范。
3. g++编译过程
经过链接产生可执行文件
g++ test.cpp
./a.out
以上两行代码其实可以划分为以下几个阶段:
- 预处理阶段(生成
.i
文件):
g++ -E test.cpp -o test.i
这一步主要做了宏的替换和注释的消除
2.将预处理后的文件转换为汇编语言(生成.s
文件)
g++ -S test.i -o test.s
3.将汇编语言转为目标代码(机器码):
g++ -c test.s -o test.o
4.链接目标代码,生成可执行程序,这里有两种写法:
动态编译:
g++ test.o -o test
静态编译:
g++ test.o -static -o test
若执行g++ test.o -o
不指定可执行文件名称,则生成a.out
两种编译方式都可生成可执行文件:
前者文件只包含文件名,运行时再链接相关函数,
后者编译时便链接相关函数,前者体积小,运行时没后者快,后者体积大。