一、gcc的编译
- 预处理(pre-processing) E:插入头文件,替换宏,将stdio.h文件中的内容插入到hello.c中
- 编译(compliling) S:编译成汇编代码
- 汇编(Assembling) c:编译成目标文件
- 链接(Linking):链接到库中,变成可执行文件
1.gcc常用选项
- o 生成目标
- E 只运行C预编译器(头文件,宏等展开)
- S 表示程序编译期间,生成汇编语言文件后停止编译(.s文件)
- c 取消链接步骤,编译源码并最后生成目标文件
- Wall 打开编译告警
2.栗子
hello.c
#include<stdio.h>
int main(void)
{
printf("Hello World n");
return 0;
}
- 预处理 gcc -E hello.c -o hello.i
- 编译 gcc -S hello.i -o hello.s
- 汇编 gcc -c hello.s -o hello.o
- 链接 gcc hello.o -o hello
可使用 gcc hello.c -o hello,直接编译成可执行文件
结果:
zxm@zxm-pc:~/gcc$ ls
hello.c
zxm@zxm-pc:~/gcc$ gcc -E hello.c -o hello.i
zxm@zxm-pc:~/gcc$ gcc -S hello.i -o hello.s
zxm@zxm-pc:~/gcc$ gcc -c hello.s -o hello.o
zxm@zxm-pc:~/gcc$ gcc hello.o -o hello
zxm@zxm-pc:~/gcc$ ls
hello hello.c hello.i hello.o hello.s
zxm@zxm-pc:~/gcc$ ./hello
Hello World
二、动态库编译与调用
1.编写动态库文件
func.c
#include <stdio.h>
void func(void)
{
printf("test dynamic lib n");
}
2.编译为动态库
- gcc -c func.c -o func.o -fPIC
- gcc func.o -o libfunc.so -shared
zxm@zxm-pc:~/gcc/dynamic$ ls
func.c
zxm@zxm-pc:~/gcc/dynamic$ gcc -c func.c -o func.o -fPIC
zxm@zxm-pc:~/gcc/dynamic$ gcc func.o -o libfunc.so -shared
zxm@zxm-pc:~/gcc/dynamic$ ls
func.c func.o libfunc.so
3.调用动态库
main.c
#include <stdio.h>
void func(void);
int main(void)
{
func();
return 0;
}
- gcc main.c -o main -L . -l func
需要把动态库文件放到 /usr/lib/ 目录下
结果:
zxm@zxm-pc:~/gcc/dynamic$ ls
func.c func.o libfunc.so main.c
zxm@zxm-pc:~/gcc/dynamic$ gcc main.c -o main -L . -l func
zxm@zxm-pc:~/gcc/dynamic$ ls
func.c func.o libfunc.so main main.c
zxm@zxm-pc:~/gcc/dynamic$ ./main
./main: error while loading shared libraries: libfunc.so: cannot open shared object file: No such file or directory
zxm@zxm-pc:~/gcc/dynamic$ sudo cp libfunc.so /usr/lib
zxm@zxm-pc:~/gcc/dynamic$ ./main
test dynamic lib
三、静态库编译与调用
1.编写静态库文件
func.c
#include <stdio.h>
void func(void)
{
printf("test static lib n");
}
2.编译静态库文件
- gcc -c func.c -o func.o
- ar -crv libfunc.a func.o
结果:
zxm@zxm-pc:~/gcc/static$ ls
func.c
zxm@zxm-pc:~/gcc/static$ gcc -c func.c -o func.o
zxm@zxm-pc:~/gcc/static$ ar -crv libfunc.a func.o
a - func.o
zxm@zxm-pc:~/gcc/static$ ls
func.c func.o libfunc.a
zxm@zxm-pc:~/gcc/static$ rm -rf func.c func.o
zxm@zxm-pc:~/gcc/static$ ls
libfunc.a
3.调用静态库
main.c
#include <stdio.h>
void func(void);
int main(void)
{
func();
return 0;
}
- gcc main.c -o main -L . -l func
zxm@zxm-pc:~/gcc/static$ ls
libfunc.a main.c
zxm@zxm-pc:~/gcc/static$ gcc main.c -o main -L . -l func
zxm@zxm-pc:~/gcc/static$ ls
libfunc.a main main.c
zxm@zxm-pc:~/gcc/static$ ./main
test static lib