Linux GCC编译使用动态、静态链接库 (转)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux GCC编译使用动态、静态链接库 (转),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1921字,纯文字阅读大概需要3分钟。
内容图文
原文出处:http://blog.csdn.net/a600423444/article/details/7206015
在windows下动态链接库是以.dll后缀的文件,二在Linux中,是以.so作后缀的文件。
动态链接库的好处就是节省内存空间。
1、Linux下创建动态链接库
在使用GCC编译程序时,只需加上-shared选项即可,这样生成的执行程序即为动态链接库。
例如有文件:hello.c x.h main.c
- 编译:gcc hello.c -fPIC -shared -o libhello.so
其中-fPIC选项的作用是:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,
所以动态载入时是通过代码拷贝的方式来满足不同的调用,而不能达到真正的代码段共享的目的.
将main.c与hello.so动态库
- gcc main.c -L. -lhello -o main
一、动态链接库
1.创建hello.so动态库
- #include <stdio.h>
- void hello(){
- printf("hello world\n");
- }
- 编译:gcc -fPIC -shared hello.c -o libhello.so
2.hello.h头文件
- void hello();
3.链接动态库
- #include <stdio.h>
- #include "hello.h"
- int main(){
- printf("call hello()");
- hello();
- }
- 编译:gcc main.c -L. -lhello -o main
这里-L的选项是指定编译器在搜索动态库时搜索的路径,告诉编译器hello库的位置。"."意思是当前路径.
3.编译成够后执行./main,会提示:
- In function `main‘:
- main.c:(.text+0x1d): undefined reference to `hello‘
- collect2: ld returned 1 exit status
这是因为在链接hello动态库时,编译器没有找到。
解决方法:
- sudo cp libhello.so /usr/lib/
这样,再次执行就成功输入:
call hello()
二、静态库
文件有:main.c、hello.c、hello.h
1.编译静态库hello.o:
- gcc hello.c -o hello.o #这里没有使用-shared
2.把目标文档归档
- ar -r libhello.a hello.o #这里的ar相当于tar的作用,将多个目标打包。
程序ar配合参数-r创建一个新库libhello.a,并将命令行中列出的文件打包入其中。这种方法,如果libhello.a已经存在,将会覆盖现在文件,否则将新创建。
3.链接静态库
- gcc main.c -lhello -L. -static -o main
这里的-static选项是告诉编译器,hello是静态库。
或者:
- gcc main.c libhello.a -L. -o main
这样就可以不用加-static
4.执行./main
输出:call hello()
三、借助自带的ldd实现程序来分析动态库搜索情况
ldd main
结果:
linux-gate.so.1 => (0x00efd000)
libhello.so => /usr/lib/libhello.so (0x00f6b000)
libc.so.6 => /lib/libc.so.6 (0x001a5000)
/lib/ld-linux.so.2 (0x00eb8000)
如果目标程序没有链接动态库,则打印“not a dynamic executable”
原文:http://www.cnblogs.com/lengbingshy/p/3936055.html
内容总结
以上是互联网集市为您收集整理的Linux GCC编译使用动态、静态链接库 (转)全部内容,希望文章能够帮你解决Linux GCC编译使用动态、静态链接库 (转)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。