一、编译过程
1、预处理
1) 展开所有的以#开始的预编译指令,过滤注释,加入行号,引入头文件,生成*.i文件
2) g++ -E hello.cpp -o hello.i
2、编译
1) 进行词法分析、语法分析、语义分析、优化后产生相应的汇编文件*.s
2) g++ -S hello.i -o hello.s
3、汇编
将编译文件*.s通过AS汇编成目标文件*.o
4、链接
1)把一些指令对其它符号地址的引用加以修正,包括地址和空间分配、符号决议、重定位等过程,将目标文件和库一起链接形成最终可执行文件.
二、常用编译方法
1、静态库编译与使用方法:
1) 将相关*.cpp生成*.o文件: g++ -C *.cpp
2) 由*.o文件创建静态库*.a文件: ar cr libXXX.a A.o B.o C.o
3) 显示静态库中的目标文件: ar tv libXXX.a
4) 使用静态库文件:g++ -o targetName *.cpp -L. -lXXX.a
2、动态链接库编译与使用方法:
1) 将cpp生成.o文件
g++ -fPIC -o A.o -c A.cpp
g++ -fPIC -o B.o -c B.cpp
2) 由*.o文件创建动态库
g++ -shared -o libXXX.so A.o B.o
3) 一句话搞定
g++ -fPIC -shared -o libXXX.so A.cpp B.cpp
3、编译参数说明
1) -fPIC 编译为独立位置的代码,必须添加,否则无法实现代码段共享;
2) -Lpath 表示在path目录搜索库文件,-L.表示当前目录;
3) -Ipath 表示在path目录搜索头文件;
4) -ltest 表示要链接的库名,表示依赖libtest.so
4、动态库和静态库重名时,优先链接动态库
5、gcc与g++的区别:
1) 都可以用于编译.c或.cpp文件;
2) gcc将.c文件当成C程序,g++将.c文件当成C++程序;
3) g++的语法检测更严格一些;
4) 对于cpp文件,gcc与g++在编译阶段是等价的,g++会调用gcc;
5) 链接由g++完成,由两种方式:g++ 或 gcc -lstdc++
6、extern “C”表示以C的命名方式来为symbol命名,否则gcc/g++都以C++方式命名