Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4190907
  • 博文数量: 776
  • 博客积分: 13014
  • 博客等级: 上将
  • 技术积分: 10391
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-22 17:00
文章分类

全部博文(776)

文章存档

2015年(55)

2014年(43)

2013年(147)

2012年(20)

2011年(82)

2010年(429)

分类: LINUX

2011-01-14 00:04:01

四、静态库的生成
    linux下静态库的生成比较方便。在生成目标文件后用 ar 打包即可。在中大型项目中一个模块一般会做成一个静态库,以方便管理、提高编译、链接效率。
    本小节的展示针对 main.c、func1.c、func2.c三个文件

  1. /*
  2.  * main.c
  3.  */
  4. #include <stdio.h>

  5. extern int func1();
  6. extern int func2();

  7. int main()
  8. {
  9.         int i;

  10.         i = func1();
  11.         printf("func1 return = %d\n",i);

  12.         i = func2();
  13.         printf("func2 return = %d\n",i);

  14.         return 0;
  15. }

  16. -----------------------------------------------------

  17. /*
  18.  * func1.c
  19.  */
  20. int func1()
  21. {
  22.         return 100;
  23. }
  24. -----------------------------------------------------

  25. /*
  26.  * func2.c
  27.  */
  28. int func2()
  29. {
  30.         return 200;
  31. }

一下是编译指令:

$ gcc -c func1.c
$ gcc -c func2.c
$ ls
func1.c  func1.o  func2.c  func2.o  main.c

func1.ofunc2.o 是我们生成的目标文件。打包指令如下:
$ ar -r libfunc.a func1.o func2.o

我们查看 libfunc.a 中的文件:
$ ar -t libfunc.a 
func1.o
func2.o

现在用静态库和 main.c 共同生成目标程序:
$ gcc -o main main.c libfunc.a
$ ./main 
func1 return = 100
func2 return = 200

和我们的预期相符合。下面我们进入动态库。

五、动态库的生成
    linux下动态库的生成通过GCC选项实现。案例程序和静态库中的相同。一下是操作指令:

首先我们生成目标文件,但是需要加编译器选项 -fpic 和链接器选项 -shared
$ gcc -fpic -c func1.c
$ gcc -fpic -c func2.c
$ gcc -shared -o libfunc.so func1.o func2.o
$ ls
func1.c  func1.o  func2.c  func2.o  libfunc.so  main.c

libfunc.so 就是我们生成的目标动态库。我们用动态库和 main.c 生成目标程序:
$ gcc -o main main.c -L. -lfunc

注意,我们用 -L. -lfunc 作为编译选项。-L. 表从当前目录查找需要的动态库,-lfunc 是动态库的调用规则。Linux系统下的动态库命名方式是 lib*.so,而在链接时表示位 -l* , *是自己起的库名。下面我们运行它:

$ ./main 
./main: error while loading shared libraries: libfunc.so: cannot open shared object file: No such file or directory

提示一个错误,指示无法找到动态库。在linux下最方便的解决方案是拷贝libfunc.so到绝对目录 /lib 下。但是只有超级用户才有这个权限。另外一个方案是更改环境变量 LD_LIBRARY_PATH。如下:
$ $ export LD_LIBRARY_PATH=`pwd`
$ ./main 
func1 return = 100
func2 return = 200

运行成功。现在我们更改动态库的函数而不重新链接。如下:
更改 func1.c 为:
int func1()
{
        return 101;
}
更改 func2.c 为:
int func2()
{
        return 202;
}
重新生成库:
$ gcc -fpic -shared func1.c func2.c -o libfunc.so
$ ./main 
func1 return = 101
func2 return = 202

可以看出,动态库已经更新了。
六、结束语
    本文简单介绍了linux下如何使用gcc进行编译程序、以及简单的静态、动态库的生成。静态库提供了一种打包管理方案,而动态库使程序局部更新成为了可能,更重要的是,当有多份实例存在时,动态库可减小内存的消耗(只占用一份代码空间)。
    对本系列知识感兴趣者可继续跟踪阅读后续文章:库的版本管理、GCC的编译选项、Makefile与自动化编译。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/clozxy/archive/2010/07/06/5716227.aspx

阅读(2370) | 评论(0) | 转发(0) |
0

上一篇:vim移动

下一篇:VIM技巧

给主人留下些什么吧!~~