gcc编译工具生成动态库和静态库之三----问题及重要知识点分析
2016-08-17 15:09
288 查看
gcc编译工具生成动态库和静态库之三----问题及重要知识点分析
一、静态库生成方式
图1 源文件生成静态库
从图一可以看出,直接由源文件生成静态库,用工具ar生成工程中不会报错,但是用工具readelf读取该静态库,会发现该静态库不是 ELF文件;说明该中方式生成的静态库不能正常使用。
图2 对象生成静态库
从图2中可以看出,需要将源文件编译成可重定向文件后,方可利用ar工具将该文件生成静态库,并且生成的静态库可以用readelf工具读出相应信息。
图3 可重定向文件
根据图3可知,gcc -c xxx.c -o xxx.o 编译之后生成的文件为可重定向文件。
二、动态链接库和静态链接库同名
图4 静态库和动态库同名
根据图4可知,ldd工具可以判断库是静态库还是动态库,并且可以知道动态库中内部链接的动态库是否可以被链接器找到。
图5 运行可执行文件报错
ldd工具查看可执行文件就可以看出无法找到libsum.so动态链接库,所以运行该文件就报错:无法打开共享对象文件。
图6 修改LD_LIBRARY_PATH环境变量
通过将动态链接库路径导出到环境变量LD_LIBRARY_PATH中,动态库无法找到文件得到解决。
三、动态链接库同名
图7 动态链接库同名
从图7中可以看出,动态链接库不能同名,当一个执行文件需要同时使用到这两个同名库中的接口时,会出现异常。
四、执行文件大小
图8 执行文件大小
从图8可以看出,链接静态库明显比链接动态库体格变大,这也是动态库和静态库的区别,一般建议使用动态库,这样可以减少占用硬盘大小。
一、静态库生成方式
图1 源文件生成静态库
从图一可以看出,直接由源文件生成静态库,用工具ar生成工程中不会报错,但是用工具readelf读取该静态库,会发现该静态库不是 ELF文件;说明该中方式生成的静态库不能正常使用。
图2 对象生成静态库
从图2中可以看出,需要将源文件编译成可重定向文件后,方可利用ar工具将该文件生成静态库,并且生成的静态库可以用readelf工具读出相应信息。
图3 可重定向文件
根据图3可知,gcc -c xxx.c -o xxx.o 编译之后生成的文件为可重定向文件。
二、动态链接库和静态链接库同名
图4 静态库和动态库同名
根据图4可知,ldd工具可以判断库是静态库还是动态库,并且可以知道动态库中内部链接的动态库是否可以被链接器找到。
图5 运行可执行文件报错
ldd工具查看可执行文件就可以看出无法找到libsum.so动态链接库,所以运行该文件就报错:无法打开共享对象文件。
图6 修改LD_LIBRARY_PATH环境变量
通过将动态链接库路径导出到环境变量LD_LIBRARY_PATH中,动态库无法找到文件得到解决。
三、动态链接库同名
图7 动态链接库同名
从图7中可以看出,动态链接库不能同名,当一个执行文件需要同时使用到这两个同名库中的接口时,会出现异常。
四、执行文件大小
图8 执行文件大小
从图8可以看出,链接静态库明显比链接动态库体格变大,这也是动态库和静态库的区别,一般建议使用动态库,这样可以减少占用硬盘大小。
相关文章推荐
- gcc编译工具生成动态库和静态库之一----介绍
- gcc编译工具生成动态库和静态库之二----实例
- gcc编译工具生成动态库和静态库之一----介绍
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- gcc链接g++编译生成的静态库和动态库的makefile示例
- gcc 编译链接生成sqlite动态库和静态库
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- linux gcc使用静态库去编译生成动态库
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- gcc链接g++编译生成的静态库和动态库的makefile示例
- gcc 编译工具(下)--- 外部库、共享库、静态库、动态库
- Linux下Gcc生成和使用静态库和动态库及相关问题总结
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库