一、编译
1、gcc编译器
gcc编译器(GNU CC)是GNU项目中符合ANSI C标准的编译系统,是一个强大的编译器。能够编译C/C++,Objective-C等。
2、编译流程
1)预处理(Pre-Processing)
对处理头文件(#include)、宏定义(#define、#ifdef)等进行处理。
gcc -E xx.c -o xx.i
2)编译(Compiling)
检查代码的规范性,语法错误等。
gcc -S xx.i -o xx.s
3)汇编(Assembling)
形成目标文件。
gcc -c xx.s -o xx.o
4)连接(Linking)
使用函数库:静态库(.a)和动态库(.so)等。
gcc xx.o -o xx
GCC编译选项:
选项 | 含义 |
---|---|
-c | 只编译不链接,生成目标文件“.o” |
-S | 只编译不汇编。 |
-E | 只进行编译 |
-g | 在可执行程序中包含调试信息 |
-o file | 将file文件至指定输出文件 |
-v | 打印编译器内部编译过程的命令行信息和编译器版本 |
-I dir | 头文件所在的目录 |
-static | 进行静态编译 |
-shared | 1、生成动态库文件。2、进行动态编译。(默认) |
-L dir | 添加库文件目录 |
-lname | 连接libname.a或libname.so库文件 |
-fPIC | 生成使用相对地址的位置无关的目标代码 |
-ansi | 支持ANSI标准的C程序 |
-pedantic | 允许发出ANSI C标准的全部警告信息 |
-pedantic-error | 允许发出ANSI C标准的全部错误信息 |
-w | 关闭所有警告 |
-Wall | 允许发出gcc提供的所有警告信息 |
-Werror | 允许发出gcc提供的所有错误信息 |
例子:
1、静态库的编译和调用
/* pow.c程序 */
unsigned int pow(usigned int a)
{
return a * a;
}
创建pow_test.c文件,调用pow.c函数。
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned int a = 9;
int res = pow(a);
printf("a^2 = %d", res);
return 0;
}
编译库文件
~# gcc -c pow.c
~# ar rcsv libpow.a pow.o
a - pow.o
编译主程序:
~# gcc pow_test.c -o pow_test -lpow
~# ./pow_test
a^2 = 81
2、编译动态链接库
step1: 以第一个例子里的简单代码为例子,首先利用-fPIC构建一个目标文件:
~# gcc -fPIC -Wall -c pow.c
step2: 生成动态链接库
~# gcc -shared -o libpow.so pow.o
step3:验证主程序:
~# gcc -o pow_tst pow_test.c -L. -lpow
~# ./pow_tst
a^2 = 81