Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157480
  • 博文数量: 76
  • 博客积分: 1513
  • 博客等级: 上尉
  • 技术积分: 755
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-25 15:15
文章分类

全部博文(76)

文章存档

2012年(2)

2011年(74)

我的朋友

分类: LINUX

2011-11-25 20:42:31

-l参数就是用来指定程序要链接的库-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。

好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件

      放在/lib/usr/lib/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest。(如果库文件在当前目录下,就是用 -L.

     一般为了不让他人看到源码,也为了维护,我们常把源码封装成一个一个的库,而库有静态库和动态库之分(根据链接时期的不同进行区分),静态库在编译的时候会被连接到目标代码中去,程序运行时不需要该库存在就能运行;动态库在编译时并不会被连接到目标代码中去,而是在程序运行过程中才载入,此时动态库必须存在。

    静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其文件扩展名为.so。

   下面举例说明如何创建Linux库文件:

   STEP 1:编写需要的C/C++ 程序

test_lib.h文件内容:

  1. const double pi = 3.1415926;

  2. double computArea(double r);

test_lib.cpp文件内容:

  1. #include <iostream>

  2. #include "test_lib.h"

  3. using namespace std;


  4. double computArea(double r)

  5. {

  6. return (pi * r * r);

  7. }

STEP2:生成test_lib.o文件

[xq@m1 test_lib]$ gcc -c test_lib.cpp

STEP3:生成libtest_lib.a静态库文件

[xq@m1 test_lib]$ ar r libtest_lib.a test_lib.o

至此,已经生成了静态库文件

STEP4:调用静态库文件

  1. #include "/home/xq/test_lib/test_lib.h"

  2. #include <iostream>

  3. using namespace std;

  4.   

  5. int main()

  6. {

  7. double area = computArea(3);

  8. cout << area << endl;

  9. return 0;

  10. }

在终端里,进行编译

[xq@m1 test_lib]$ g++  mian.cpp -L. -ltest_lib -o mian

[xq@m1 test_lib]$ ./mian 
28.2743

(如果需要再Eclipse里面配置,则如图所示:

阅读(970) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~