什么是gcc?
GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器
GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理C++。后来又扩展能够支持更多编程语言,如Fortran、Pascal、Objective-C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)
GCC编译的四个阶段
gcc的参数:
-I 指定头文件目录
-D 预定义宏
-o 生成目标文件
-O 编译优化
-c 只编译子程序
-E 生成预处理文件
-g 包含调试信息
-Wall 提示更多警告信息
-v 查看版本号
静态库的制作
1.命名规则:
lib + 库的名字 + .a 如libTest.a
2.制作步骤:
①生成对应的 .o 文件
gcc test.c –c
②将生成的 .o 文件打包
ar rcs + 静态库的名字(libTest.a) + 生成的所有 .o 文件
3.发布和使用静态库
发布静态库的时候把静态库目录 (lib) 和头文件目录 (include) 一起打包
使用静态库
gcc main.c -Iinclude(指定头文件目录) -L lib(连接静态库目录) -l Test(要使用的lib名) –o app
4.静态库的优缺点
优点:
1.发布程序的时候,不需要提供对应的库
2.加载库的速度快
缺点:
1.库被打包到应用程序中,导致库的体检很大
2.库发生了改变,需要重新编译程序
共享库(动态库)的制作
1.命名规则:
lib + 名字 + .so
2.制作步骤
①生成与位置无关的代码
gcc –fPIC –c *.c -I ./include
②将.o文件打包成共享库
gcc -shared -o libTest.so *.o -I ./include
3.使用动态库
gcc main.c -Iinclude(指定头文件目录) -L lib(连接静态库目录) -l Test(要使用的lib名) –o app
4.解决程序运行时动态库无法被加载的问题
ldd app(查看可执行程序的依赖的动态链接库的信息)
①直接将 lib 复制到 /lib (不允许使用,别用)
②测试动态库,临时设置lib环境变量
export LD_LIBRARY_PATH=./lib
终端关闭后,不生效
③永久性设置 lib 环境变量(不常用)
cd
vim .bashrc
最后一行追加 export LD_LIBRARY_PATH xxx/xxx/xxx/lib
.bashrc修改后,重启终端才可生效
④找动态链接器的配置文件
cd /etc
把动态库lib的绝对路径追加到配置文件中
vim ld.so.conf
xxx/xxx/xxx/lib
更新配置文件使其生效
sudo ldcongif -v(查看信息)
5.动态库的优缺点:
优点:
1.执行程序体积小
2.动态库更新了,不需要重新编译程序
缺点:
1.发布程序的时候,需要将动态库提供给用户
2.动态库没有被打包到应用程序中,加载速度相对较慢(与静态库相比)
Comments