预处理器 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
hello.c gcc -E hello.i gcc -S hello.s gcc -c hello.o gcc a.out
1、指定头文件
示例:gcc sum.c -I ./include -o app
2、指定动态库
示例:gcc sum.c -L 动态库的所在路径 -l动态库的名
-D 指定程序中的宏
-O 是否优化程序 -O0 不优化 -O1 稍微优化 -O2 更优化 -O3 最优化了,不能再优化
-Wall 输出警告信息
-g 生成的程序可以进行gdb调试
静态库的使用
命名规则 lib+库名字+.a
制作过程 生成对应的.o .c --> .o -c gcc *.c -c
将生成的.o文件打包 ar rcs + 静态库的名字(libMytest.a)+生成的所有的.o ar rcslibMytest.a *.o
发布和使用静态库
发布静态库
头文件
编译 gcc main.c lib/liblibMytest.a
或者用-l指定
使用优点 直接打包到程序中,不用需要库了 库的加载速度快
缺点 程序变得很大 库变化了,要重新编译程序
共享库的制作
命名规则: lib+名字+.so
制作步骤:
生成与位置无关的代码(生成与位置的.o) gcc -fPIC -c *.c
gcc -share -o libMyCalc.so *.o
如果出问题:
使用ldd 应用程序 示例 ldd myapp 看哪个库没有找到
动态库会查找PATH中的路径
解决动态库链接失败问题?
1、可以指定动态库路径 export LD_LIBRARY_PATH 这个只是临时的
2、export LD_LIBRARY_PATH= 这个加入.bashrc文件中 这个是永久的
3、可以把so文件拷贝到/ib目录中
4、需要找到动态连接器的配置文件(/etc.ld.so.conf) 动态库的路径写到配置文件中 更新sudo ldconfig