本篇主要讲GCC编译过程以及静态库和动态库编译
一、gcc编译指令各项参数
四个步骤
预处理 -E gcc -o test.i -E test.c
汇编 -S gcc -o test.s -S test.c
机器码 -c gcc -o test.o -c test.c
链接 依赖的文件 gcc -o test test.o
-o 生成目标
-g 调试
1.常用参数
-L 指定库文件所在的目录
静态库 .a 链接时被编译到可执行程序中,运行时在可执行文件中找函数
动态库 .so 链接时只是指定了要调用的库,运行时到/lib 里去找函数库
库文件名 前缀+库名+后缀
lib .a .so
libm.a 是math.h libm.a是库文件名 m是库名
库名
-l 指定库名
gcc -o test test.c mplay.c -L/usr/lib -lpthread
pthread是库名 库文件名在/usr/lib目录中,-L可省略 -l必须存在
-static 代表强制使用静态
-shared 动态
-I 用来指定头文件所在的目录
gcc -o test -I./lib -include mplay.h test.c ./lib/mplay.c -lpthread
gcc -o test -I./lib test.c ./lib/mplay.c -lpthread
-include 用来指定引入头文件
gcc -o test -include mplay.h test.c mplay.c -lpthread
-L 和-l是链接时使用
-I 和-include 机器码时使用
2.其它参数
-shared 生成共享目标文件。通常用在建立共享库时。
-static 禁止使用共享连接。
-w 不生成任何警告信息。
-Wall 生成所有警告信息。
-O0 不进行优化处理。
-O 或 -O1 优化生成代码。
-O2 进一步优化。
-O3 比 -O2 更进一步优化,包括 inline 函数。
-g 生成调试信息。GNU 调试器可利用该信息。
-ansi 只支持 ANSI 标准的 C 语法。
-pipe 使用管道
3.静态库编译
两个步骤
1)生成机器码 -c
2)用ar编译静态库
gcc -o mplay.o -c mplay.c
ar -rc libmplay.a mplay.o
库的使用
gcc -o test -I./lib test.c -L./lib -lmplay -lpthread
-lm 指针libm.a 里面是函数的定义
math.h 是libm.a内函数的扩展声明
4.动态库编译
1)生成机器码 -c
2)用gcc编译静态库 -shared -fPIC
gcc -o mplay.o -c mplay.c
gcc -shared -fPIC -o libmplay.so mplay.o
库的使用
gcc -o test -I./lib -include mplay.h test.c -L./lib -lmplay -lpthread
将libmplay.so拷贝到/lib中然后运行程序
强制指定使用静态库编译程序
gcc -o test -I./lib -include mplay.h test.c -L./lib -lmplay -lpthread -static
5.c++调用标准c的函数
//test.cpp
extern “C”{
#include “mplay.h”
}