g++ 编译介绍
编译/链接过程
-E 选项 编译器仅对输入文件进行预处理
g++ -E test.cpp -o test.i
-S 编译选项告诉 g++ 在为 c++ 代码产生了汇编语言文件后停止编译
g++ -S test.i -o test.s
汇编
// 缺省时 g++ 建立的目标代码文件有一个 .o 的扩展名
g++ -c test.s -o test.o
链接
// 产生可执行文件 test
g++ test.o -o test
编译参数
- -g 编译带调试信息的可执行文件
g++ test.o -o test -g
-
-O[n] 优化源代码
-
-O0 不做优化
-
-O1 默认优化,与 -O 等价
-
-O2 会牺牲部分编译速度,除了执行-O1所执行的所有优化之外,还会采用几乎所有的目标配置支持的优化算法,用以提高目标代码的运行速度
-
-O3 除了执行-O2所有的优化选项之外,一般都是采取很多向量化算法,提高代码的并行执行程度,利用现代CPU中的流水线,Cache等
-
-Os 和-O3有异曲同工之妙,当然两者的目标不一样,-O3的目标是宁愿增加目标代码的大小,也要拼命的提高运行速度,但是这个选项是在-O2的基础之上,尽量的降低目标代码的大小,这对于存储容量很小的设备来说非常重要。
为了降低目标代码大小,会禁用下列优化选项,一般就是压缩内存中的对齐空白(alignment padding)-fno-protect-parens -fstack-arrays
-
-Ofast 将不会严格遵循语言标准,除了启用所有的-O3优化选项之外,也会针对某些语言启用部分优化。如:-ffast-math ,对于Fortran语言,还会启用下列选项:
-
-Og 会精心挑选部分与-g选项不冲突的优化选项,能提供合理的优化水平,同时产生较好的可调试信息和对语言标准的遵循程度
-
链接参数
-
-l (L 小写)紧跟链接库的名称
linux 下 /lib /usr/lib /usr/local/lib 的库直接用 -l 就能链接
-
-L 后紧跟链接库所在目录的名称
如果库文件没在默认目录中,可以指定库目录
其它参数
-
-Wall 打印告警信息
-
-w 关闭告警信息
-
-std=c++11 设置c++编译标准
-
-o 指定输出文件名
-
-D 定义宏
-DDEBUG -> 开启 DEBUG 宏
-
-I(i 大写) 指定头文件的搜索目录
/usr/include 目录一般不用指定,如果头文件不在 /usr/include 下,需要 -I 指定头文件搜索目录
上手编译
直接编译生成
目录结构如下:
.
├── bin
├── build
│ └── build_src.sh
├── include
│ └── calc.h
├── lib
├── src
│ ├── calc.cpp
│ └── main.cpp
└── test
calc.h
#ifndef __CALC_H__
#define __CALC_H__
class Calc
{
public:
int add(int a, int b);
int sub(int a, int b);
};
#endif // __CALC_H__
calc.cpp
#include <calc.h>
#include <iostream>
int Calc::add(int a, int b)
{
std::cout << "sum = " << a + b << std::endl;
return a + b;
}
int Calc::sub(int a, int b)
{
std::cout << "sub = " << a - b << std::endl;
return a - b;
}
main.cpp
#include <iostream>
#include "calc.h"
int main()
{
Calc c;
c.add(1, 2);
c.sub(2, 1);
std::cout << "This is a c++ test application." << std::endl;
return 0;
}
执行编译命令
g++ ./src/calc.cpp ./src/main.cpp -o ./bin/test -I./include
我们生成了 test 的可执行程序
通过链接 calc 库生成
链接 calc 动态库生成
生成动态库
g++ ./src/calc.cpp -I./include -fPIC -shared -o ./lib/libCalc.so
链接动态库,生成可执行文件
g++ ./src/main.cpp -I./include -L./lib -lCalc -o ./bin/test_lib_dynamic
执行 ./bin/test_lib_dynamic
xxx/Test# export LD_LIBRARY_PATH=./lib;./bin/test_lib_dynamic
sum = 3
sub = 1
This is a c++ test application.
链接 calc 静态库生成
生成静态库
g++ -c ./src/calc.cpp -I./include -o ./lib/calc.o
ar rs ./lib/libCalc.a ./lib/calc.o
链接静态库,生成可执行文件
g++ ./src/main.cpp -I./include -L./lib -lCalc -o ./bin/test_lib_static
执行 ./bin/test_lib_static
xxx/Test# ./bin/test_lib_static
sum = 3
sub = 1
This is a c++ test application.
主要介绍了 g++ 的编译/链接过程,以及如何去编译和链接动态库和静态。
祝愉快!