c语言编译过程
预处理
1
g++ -E test.cpp -o test.i
编译
1
g++ -S test.i - o test.s
汇编
1
g++ -c test.s -o test.o
链接
g++ test.o -o test链接glog库 g++ -lglog test.cpp -l 参数在/lib和/usr/lib/和/usr/local/lib里的库 如果库没有在上面三个目录里,需要使用-L参数指定库文件所在目录1
2
3
4
5
6
7
c语言编译参数
* -O[n]优化源代码,一般用`-O2`
* -l和-L-I 默认在/usr/include目录1
2
3
* -I指定头文件搜索目录在使用gcc/g++编译的时候定义宏 #include<stdio.h> int main() { #ifdef DEBUG printf("DEBUG LOG\n"); #endif printf("in\n"); } g++ -DDEBUG main.cpp 执行第一行打印1
2
3
4
5
6
7
8
9
10
11
* -Wall 打印警告信息
* -w 关闭警告信息
* -std = c++11设置编译标准
* -o 指定输出文件名
* -D 定义宏1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
### c语言生成静态库
* 首先生成.o的二进制文件,然后用ar生成.a的文件`ar rs x.a x.o`,静态库以.a结尾的
### c语言生成动态库
* `gcc x.cpp -I../include -fPIC -shared -o x.so` 等价于这两条分开
* `gcc x.cpp -I../include -c fPIC`;`gcc -shared -o x.so x.o `
### 为什么需要生成库呢
* 因为需要隐藏实现细节,这样就可以封装给别人用,别人看不到源代码
### 动态库和静态库的区别
* 静态库可以直接运行
```bash
./xxx动态库需要
1
LD_LIBRARY_PATH = src ./xx
gdb调试器
g++ -g xx.cpp -o a_yes_g
c语言分析器
(float (*h)()*h = 函数 h就是指向函数的指针