技术: Linux 静态&动态库

这里我记录的是曾经踩过的坑, 主要是生成和使用, 优缺点等理论内容不说.

引子

linux平台下, 目标文件分为3种:

  • 可重定向目标文件
  • 可执行目标文件
  • 共享目标文件(共享库)

这里从第三种入手, 讲讲linux下的库的生成和使用, 文章很短.

正文

静态库

生成静态库:

1
ar src libtest.a xx.o yyy.o     (相当于一个简单的打包过程)

使用静态库:

1
2
3
4
5
gcc main.c -ltest.a -o main  
/*或者*/
gcc -L. main.c -o main
/*或者*/
gcc main.c -static ./test.a -o app

后2种指定当前库的搜索路径为当前目录, 推荐使用 -static 选项.

动态库

生成一个动态库:libtest.so

1
$ gcc -shared -fPIC test_a.c test_b.c test_c.c  -o libtest.so

相关选项说明:

  • -shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表, 有时候也生成弱连接W类型的导出符号)不用该标志外部程序无法连接, 相当于生成一个可执行文件.
  • -fPIC 表示编译为位置独立的代码, 不用此选项的话编译后的代码是位置相关的, 所以静态库载入时是通过代码拷贝的方式来满足不同进程的需要, 而不能达到真正代码段共享的目的.

使用动态库:

1
gcc test.c -L. -ltest -o test

使用时-l一定放在源文件之后.

测试是否动态链接了动态库:

1
ldd test

但是生成的可执行文件, 在运行的时候也要能找到相关运行库才可以.

LD_LIBRARY_PATH 这个环境变量指示动态连接器可以装载动态库的路径; 当然如果有root权限的话, 可以修改 /etc/ld.so.conf 文件, 然后调用 /sbin/ldconfig 来达到同样的目的,不过如果没有root权限, 那么只能采用 export LD_LIBRARY_PATH , 如果找不到加载路径, 通常会在运行时报错找不到符号xxx.

尾巴

最初学习 linux c 的时候学习的该内容, 现在复习起来也别有一番乐趣.


who is sponsoring the site? - i shall say merlin (wizardmerlin945@gmail.com)
欢迎发邮件给我(生活问题,请高抬贵手)

文章目录
  1. 1. 引子
  2. 2. 正文
    1. 2.1. 静态库
    2. 2.2. 动态库
  3. 3. 尾巴
|