gcc常用编译应用实例:
例1:
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_elf 链接
例2:
gcc hello.c -o hello_elf
静态库与动态库
链接方式
链接分为两种:静态链接、动态链接
静态链接:
由链接器在链接时将库的内容加入到可执行程序中
静态链接的特点是:
优点:
对运行环境的依赖性较小,具有较好的兼容性
缺点:
生成的程序比较大,需要更多的系统资源,在装入内存时会消耗更多的时间
库函数有了更新,必须重新编译应用程序
动态链接:
连接器在链接时仅仅建立与所需库函数的之间的链接关系,在程序运行时才将所需资源调入可执行程序
动态链接的特点:
优点:
在需要的时候才会调入对应的资源函数
简化程序的升级;有着较小的程序体积
实现进程之间的资源共享(避免重复拷贝)
缺点:
依赖动态库,不能独立运行
动态库依赖版本问题严重
动态链接库的使用2:
1.库函数、头文件均在系统路径下
#cp libtestlib.so /lib
#gcc mytest.c -o mytest -ltestlib
#./mytest
编译运行都不会出错
问题:有个问题出现了?
我们前面的静态库也是放在/lib下,那么连接的到底是动态库还是静态库呢?
当静态库与动态库重名时,系统会优先连接动态库,或者我们可以加入-static指定使用静态库
示例:
gcc main_grade.c fun_grade.c -o grade_elf -static // 静态编译可执行文件
gcc main_grade.c fun_grade.c -o grade_elf // 默认动态编译可执行文件
静态库编译可执行文件
gcc -c ./src/fun_grade.c -o ./lib/fun_grade.o
ar rc ./lib/libfun_grade.a ./lib/fun_grade.o
gcc ./src/main_grade.c -o grade_elf -L./lib/ -lfun_grade-I./inc/
动态库编译可执行文件
gcc -shared ./src/fun_grade.c -o ./lib/libfun_grade.so
gcc ./src/main_grade.c -o grade_elf -L./lib/ -lfun_grade -I./inc/
解决无法打开动态库的常用简便方法:
声明临时变量环境
export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
或者修改 /etc/ld.so.conf 文件 在其中添加库的搜索路径,一行一个路径。
sudo ldconfig 更新 /etc/ld.so.cache 文件
那 ./etc/ld.so.conf 中所有路径的库文件都被缓存达到 /etc/ld.so.cache 中。