非常建议去看一下B站这个课程:基于VSCode和CMake实现C/C++开发 | Linux篇:
就是讲在不使用Visual Studio这种IDE的情况下,纯靠g++/gcc这样的命令行去逐步执行cpp程序的编译,链接,执行等操作。
另外,也可以看一下这篇文章,都有助于理解用编译器的命令行去执行cpp程序:
MacOS使用clang
这里复习一下本科的知识,
.cpp
后缀)转换为机器指令的目标程序(object program,比如:.o
后缀)编译
得到相应的目标程序,再将这些目标程序链接
成为一个统一的二进制的可执行程序。#
开头的,比如宏定义和include)进行预处理,详见 1.2 预处理指令。C/CPP的编译过程:
.obj
的后缀,UNIX下一般是.o
的后缀)。.exe
的后缀,UNIX下一般没有后缀)
参考:
#include
这句话并不是C++语句,而是C++的一个预处理指令,以#
开头与常规的C++语句相区别,行的末尾没有分号。#include
是个包含指令,将iostream
文件的内容包含到该命令所在的程序文件中,代替该指令。#include
指令,然后再对该程序单元进行整体编译。这个属于编译原理的内容了,可以看看 Alfred V. Aho,Monica S.Lam的编译原理,这里大概放个图:
代码的编译过程可以分为预处理,词法分析,语法分析,语义分析,目标代码,链接,生成可执行程序。
如果想看gcc的,可以看 【本质】你知道C语言编译的过程吗?这篇文章。
以下内容,大部分出自:MacOS使用clang
编译用的clang_demo.cpp 源码:
#include
#define STR "Hello world"
int main(int argc, const char * argv[]) {
std::string a = STR;
std::cout << a << std::endl;
return 0;
}
查看编译步骤:
(由于是cpp语言,因此用clang++,就好像gcc命令是c语言,g++就是cpp一样)
> clang++ -ccc-print-phases clang_demo.cpp
0: input, "clang_demo.cpp", c++
1: preprocessor, {
0}, c++-cpp-output
2: compiler, {
1}, ir
3: backend, {
2}, assembler
4: assembler, {
3}, object
5: linker, {
4}, image
6: bind-arch, "x86_64", {
5}, image
可以看到,分为6步:
0.输入c++源码程序
1.预处理器,0是输入,输出是把`#`等包含指令解开后的cpp代码