一、编译的四个阶段
源文件:编写的文件代码.c /.cpp
预处理:编译处理宏定义等宏命令(eg:#define)——生成后缀为“.i”的文件
编译:将预处理后的文件转换成汇编语言——生成后缀为“.s”的文件
汇编:由汇编生成的文件翻译为二进制目标文件——生成后缀为“.o”的文件
链接:多个目标文件(二进制)结合库函数等综合成的能直接独立执行的执行文件——生成后缀为“.out/.exe”的文件
命令:unix>gcc –E hello.c -o hello.i
作用:将hello.c预处理输出hello.i
命令:gcc -S hello.i -o hello.s
作用:将预处理输出文件hello.i汇编成hello.s文件
命令:gcc -c hello.s -o hello.o
汇编器as 将hello.s 翻译成机器语言保存在hello.o 中(二进制文本形式)。
命令:gcc hello.o -o hello
链接阶段,变为可执行程序
在我们理解了上述四个流程后,我们在关注gcc和g++在流程上的区别。
gcc无法进行库文件的连接,即无法编译完成步骤4;而g++则能完整编译出可执行文件。(实质上,g++从步骤1-步骤3均是调用gcc完成,步骤4连接则由自己完成)
二、gcc 与g++的区别
首先说明:gcc 和 GCC 是两个不同的东西
GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。
gcc是GCC中的GUN C Compiler(C 编译器)
g++是GCC中的GUN C++ Compiler(C++编译器)
三、创建静态库
Windows平台静态库是lib文件,UNIX平台动态库是a文件
main.cpp
#include <iostream>
// #include "add.cpp"
using namespace std;
int main(int argc, char* argv[])
{
int add(int a, int b);
int c = add(1, 2);
cout << c << endl;
return 0;
}
add.cpp
#include "iostream"
int add(int a, int b)
{
return a + b;
}
1.将代码编译为二进制文件.o
g++ -c add.cpp
2. 将.o文件编译为静态库文件.a
ar -cr liboperation.a add.o
3.将静态库文件与主程序进行链接
g++ main.cpp liboperation.a -o exec
g++ main.cpp liboperation.a 不加-o自动生成可执行程序名称
gcc main.c -o all_a -loperation
四、创建动态库
Windows平台动态库是dll文件,UNIX平台动态库是so文件
UNIX编译
1.编译二进制文件.o
g++ -c -fpic add.cpp
2.将.o文件变为动态库.so文件
g++ -shared add.o -o liboperation.so
3.将动态库与主程序链接
(-l 后面写参数时会自动去掉动态库的lib前缀和.so后缀)
g++ main.cpp -o exec -loperation -LD://C++//project//03
gcc main.c -o all_so -loperation
Windows平台编译
1.编译二进制文件.o
g++ -c -fpic add.cpp
2.将.o文件变为动态库.dll文件
g++ -shared add.o -o liboperation.dll
3.将动态库与主程序链接
g++ main.cpp -o exec -loperation -LD://C++//project//03
g++ main.cpp -LD://C++//project//03 -loperation
Makefile使用
Makefile文本
debug:
@echo "hello"
clean:
@rm -rf D:\C++\project\03\a.exe
.PHONY: clean debug
D:\C++\qt5.12.7\Tools\mingw730_64\bin\mingw32-make.exe debug
输出值,在变量前面加了@不输出命令只输出结果
Make变量
cpp := main.cpp
obj := main.o
$(obj):$(cpp)
@g++ -c $(cpp) -o $(obj)
compile:$(obj)
debug:
@echo $(cpp)
@echo $(obj)
D:\C++\qt5.12.7\Tools\mingw730_64\bin\mingw32-make.exe compile 执行命令将main.cpp生成main.o
cpp := main.cpp
obj := main.o
$(obj):$(cpp)
@g++ -c $< -o $@
compile:$(obj)
clean:
@rm -rf $(obj)
.PHONY: clean
debug:
@echo $(cpp)
@echo $(obj)
Make常用的运算符
=会改变后续的值 :=不会改变后续的值
HOST_ARCH = aarch64
TARGET_ARCH = $(HOST_ARCH)
HOST_ARCH = amd64
debug:
@echo $(TARGET_ARCH)
Make file
HOST_ARCH = aarch64
HOST_ARCH ?= amd64
debug:
@echo $(TARGET_ARCH)
+=相等于后续添加内容
Make file常用的函数