linux中编译静态库(.a)和动态库(.so)的基本方法

时间:2024-10-13 07:45:36

静态库
       在linux环境中, 使用ar命令创建静态库文件.如下是命令的选项:
          d -----从指定的静态库文件中删除文件
          m -----把文件移动到指定的静态库文件中
          p -----把静态库文件中指定的文件输出到标准输出
          q -----快速地把文件追加到静态库文件中
          r -----把文件插入到静态库文件中
          t -----显示静态库文件中文件的列表
          x -----从静态库文件中提取文件
      还有多个修饰符修改以上基本选项,详细请man ar 以下列出三个:
          a -----把新的目标文件(*.o)添加到静态库文件中现有文件之后
          b -----***************************************之前
          v -----使用详细模式
ar 命令的命令行格式如下:
      ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...
参数archive定义库的名称, files是库文件中包含的目标文件的清单, 用空格分隔每个文件.
比如创建一个静态库文件的命令如下:
      ar r
这样就了静态库文件, 可以用 t 选项显示包含在库中的文件 创建库文件之后,可以创建这个静态库文件的索引来帮助提高和库连接的其他程序的编译速度.使用ranlib程序创建库的索引,索引存放在库文件内部.
      ranlib
用nm程序显示存档文件的索引,它可以显示目标文件的符号
nm | more
如果是显示目标文件的符号:
nm | more


如何使用呢?如下所示:
gcc -o test
这样就可以在中调用在中的函数了.


动态库
创建共享库
     gcc -shared -o
这样就创建了共享库!


编译共享库
    假设共享库位于当前目录(即跟程序文件相同的目录中)
gcc -o test -L. -lapue
这样就编译出了不包含函数代码可执行文件了。

 

但是但你运行时会发现linux动态加载器打不到文件.
可以用ldd 命令查看可执行文件依赖什么共享库:
ldd test


如何才能让动态加载器发现库文件呢?有两种方法可以解决:

 

1.环境变量     

LD_LIBRARY_PATH 环境变量  
/etc/文件
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:."


2.修改/etc/文件.位于/etc/
一般应用程序的库文件不与系统库文件放在同一个目录下,一般把应用程序的共享库文件放在/usr/local/lib下,新建一个属于自己的目录apue,然后把刚才复制过去就行了
同时在/etc/中新增一行:
/usr/local/lib/apue


以后在编译程序时加上编译选项:
-L/usr/local/lib/apue -lapue
这样就可以使用这个共享库了!!