gcc/g++ 链接库的编译与链接

 gcc/g++的编译参数,这里只介绍 -L 、-l、-include、-I、-shared、-fPIC

      -L :表示要链接的库所在的目录。-L.  表示要链接的库在当前目录, -L/usr/lib 表示要连接的库在/usr/lib下。目录在/usr/lib时,系统会自动搜索这个目录,可以不用指明。

     -l (L的小写):表示需要链接库的名称,注意不是库文件名称,比如库文件为 libtest.so,那么库名称为test

     -include :包含头文件,这个很少用,因为一般情况下在源码中,都有指定头文件。

      -I (i 的大写):指定头文件的所在的目录,可以使用相对路径。

     -shared :指定生成动态链接库

     -fPIC:  表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时事通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码共享的目的。

 

      生成链接库

      第1步,生成目标文件:g++ -c xxx.cpp

 

       第2步,创建静态链接库:  ar  cqs  libxxxx.a  xx1.o xx2.o xx3.o (参数选项请看【5】)

        第3步,程序中使用静态链接库

        第4步,创建动态链接库 g++ -fPIC -shared -o libxxx.so xx1.cpp xx2.cpp xx3.cpp

        第5步,动态链接库使用

 

 

       库的链接,上面简单演示了一遍库的生成过程,但是还有很多细节没有讲清楚。以下问题需要注意:

       1. 链接过程中可能出现多种链接方式,需要使用一些参数来指定,下面只是一个演示,在测试时,自己填写具体的名称

 

[plain] view plain copy

  1. g++ testmain.o -o testmain -WI,-Bstatic -lstaticlib -WI,-Bdynamic -ldynamiclib  


 

      2. 链接过程中同一个库(名称相同)的静态和动态两种链接库,在链接过程中,系统优先选择动态链接库

 

 

     3. 动态链接库路径,系统默认在/usr/lib 和/usr/local/lib两个库目录搜索,自己定义的库需要格外指定路径(设定变量LD_LIABRARY_PATH)或者将其拷贝到这两个目录下,在上面的例子的测试过程,已经有说明。当然也可以将当前路径添加到/etc/ld.so.conf文件中或者/etc/ld.so.conf.d目录下的一个文件中。

 

      4. 查看动态链接库。有时候可能需要查看一个库中到底有哪些函数,nm命令可以打印出库中的涉及到的所有符号。库既可以是静态的也可以是动态的。nm列出的符号有很多,常见的有三种:

        一种是在库中被调用,但并没有在库中定义(表明需要其他库支持),用U表示;

        一种是在库中定义的函数,用T表示,这是最常见的;

        另一种所谓的“弱态”符号,它们虽然在库中定义,但可能被其他库中的同名符号覆盖,用W表示。

 

         使用ldd命令可以查看程序的库依赖:

 

posted @ 2019-03-31 01:21  jadeshu  阅读(3303)  评论(0编辑  收藏  举报