Gcc
by
gcc
gcc 的工作流程
- 预处理:cpp预处理器,去掉注释,展开头文件,宏替换
gcc -E test.c -o test.i
- 编译:gcc,将源代码文件编译成汇编语言代码
gcc -S test.i -o test.s
- 汇编:as,将汇编语言代码编译成二进制文件(目标代码)
gcc -C test.s -o test.o
- 链接:ld,链接test.c代码中调用的库函数
gcc -o test test.o
gcc 常用参数
- -v 查看gcc版本号
- -E 生成预处理文件
- -S 生成汇编文件
- -c 只编译,生成.o文件,通常称为目标文件
- -I 指定头文件所在的路径
- -L 指定库文件所在的路径
- -l 指定库的名字
- -o 指定生成的目标文件的名字
- -g 包含调试信息,使用gdb调试需要添加此参数
- -On n=0~3 编译优化,n越大优化越多
- -D 编译时定义宏
gcc -o test test.c -D MAX=10
静态库的制作和使用
静态库的制作
- 将.c文件编译成.o文件
gcc -c fun1.c fun2.c
- 使用ar命令将.o文件打包成.a文件
ar rcs libtest1.a fun1.o fun2.o
静态库的使用
- main.c 与 head.h 和 libtest.a 在同一级目录的情况
gcc -o main main.c -I./ -L./ -ltest
- main.c 与 head.h 和 libtest.a 不在同一级目录的情况
gcc -o main main.c -I./include -L./lib -ltest
动态库的制作和使用
动态库的制作
- 将.c文件编译成.o文件
gcc -fpic -c fun1.c fun2.c
- 使用gcc将.o文件编译成库文件
gcc -shared fun1.o fun2.o -o libtest2.so
动态库的使用
gcc -o main main.c -I./include -L./lib -ltest
动态库无法加载问题
如何让系统找到共享库
- 拷贝自己制作的共享库到 /lib 或者 /usr/lib
- 临时设置 LD_LIBRARY_PATH:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径
- 永久设置:
- 把
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径
设置到~/.bashrc
文件中,然后在执行下列三种办法之一:- 执行
. ~/.bashrc
使配置文件生效 - 执行
source ~/.bashrc
使配置文件生效 - 退出当前终端,然后再次登陆也可以使配置文件生效
- 执行
- 把