专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 编程

gcc 编译动态库跟静态库

发布时间:2011-07-01 07:28:02 文章来源:www.iduyao.cn 采编人员:星星草
gcc 编译动态库和静态库

Linux C 编程入门之一:gcc 编译动态库和静态库

cheungmine

2012

1 准备工作

Windows7+Cygwin+gcc

在同一个目录下准备好下面3个文件,其中3-2,3-3用来生成动态库或静态库:

主调用程序源代码3-1:main.c

库源代码3-2:hello_fn.c

库头文件源代码3-3:hello_fn.h

2 编译库

2.1 首先编译源文件生成对象(obj)文件(main.o, hello_fn.o):

2.2 然后从对象文件编译动态库文件(libhello.so)和静态库(libhello.a)


3 编译使用库的主程序

3.1 如果不链接库的情况下编译一个主程序是:

但是由于我们在main.c的代码中写固定了调用库的代码(hello函数),所以,必须链接到这个库才行。

3.2 链接到动态库libhello.so


这样在当前目录下就生成了:main.exe(我的cygwin环境,Linux环境下没有扩展名)

运行这个main.exe:

删除libhello.so,再运行main.exe会报错误:error while loading shared libraries: libhello.so: cannot open shared object...

3.3 链接到静态库libhello.a

删除libhello.a,运行main2.exe,一切正常。说明程序的确链接到静态库了。

4 查看程序依赖的库

如果我们的动态库libhello.so与主程序不在同一个目录下,怎么办?

复制libhello.so和libhello.a到另外一个目录,比如:/cygdrive/c/temp,那么编译主程序为:

5 运行时加载动态库

修改main.c文件为如下清单:


然后重新编译main.exe和libhello.so如下:


6 总结

通过上面的练习,基本清楚了如何用gcc编译程序,包括静态链接库和动态链接库。通过下面的表格可以看到

Linux和Windows的区别:

                               Windows                      Unix/Linux

----------------------------------

静态链接库              hello.lib                            libhello.a

动态链接库              hello.dll                            libhello.so

延迟加载                  LoadLibrary                    dlopen

                                  GetProcAddress            dlsym

                                  FreeLibrary                     dlclose


本文全部内容在cygwin上运行的,和真实的Linux环境还是存在差异的。gcc版本3.4.4。






友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: