1. 静态库


  • 静态库文件命名:libxxxx.a

1.1 步骤:

Linux命令(十二)制作静态库和共享库_可执行程序


ar rcs libCalc.a *.o


Linux命令(十二)制作静态库和共享库_动态库_02

1.2 用nm查看文件内容

Linux命令(十二)制作静态库和共享库_目标文件_03

1.3 发布并使用


gcc main.c -o mycpp.out -I include/ -L lib/ -lCalc


Linux命令(十二)制作静态库和共享库_可执行程序_04

注意: -L:包含库路径, -l:指定库名(通常是 -lmylib (库名为libmylib.a))

2. 动态库

Linux命令(十二)制作静态库和共享库_可执行程序_05

Linux命令(十二)制作静态库和共享库_动态库_06

1. 编译与位置无关的代码,生成.o


gcc -fPIC -c *.c -I ../include/


Linux命令(十二)制作静态库和共享库_目标文件_07

注意:这些 *.o文件 与位置无关

2. 将.o文件打包: 关键参数 shared


gcc -shared -o libCalc.so *.o


Linux命令(十二)制作静态库和共享库_可执行程序_08

3. 发布库文件和头文件


gcc main.c -o newapp.out -I include/ -L lib/ -lCalc


此时虽然编译好了,但是无法使用

Linux命令(十二)制作静态库和共享库_可执行程序_09

Linux命令(十二)制作静态库和共享库_动态库_10

解决:

1. 拷贝到下面目录

Linux命令(十二)制作静态库和共享库_目标文件_11

2. 创建软链接


sudo ln -s /tmp/Douzi/calc/lib/libmyCalc.so /lib/libmyCalc.so


Linux命令(十二)制作静态库和共享库_动态库_12

3. 改变环境变量

Linux命令(十二)制作静态库和共享库_动态库_13

或者:

Linux命令(十二)制作静态库和共享库_共享库_14

sudo ldconfig -v

永远生效则修改 .config

Linux命令(十二)制作静态库和共享库_动态库_15

3. 动态库补充 -soname

3.1 g++(gcc)编译选项


  • l  -shared :指定生成动态链接库。
  • l  -static :指定生成静态链接库。
  • l  -fPIC :表示编译为位置独立的代码,用于编译共享库。目标文件需要创建成位置无关码, 念上就是在可执行程序装载它们的时候,它们可以放在可执行程序的内存里的任何地方。
  • l  -L. :表示要连接的库所在的目录。
  • l  -l:指定链接时需要的动态库。编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.a/.so来确定库的名称。
  • l  -Wall :生成所有警告信息。
  • l  -ggdb :此选项将尽可能的生成gdb 的可以使用的调试信息。
  • l  -g :编译器在编译的时候产生调试信息。
  • l  -c :只激活预处理、编译和汇编,也就是把程序做成目标文件(.o文件) 。
  • l  -Wl, options :把参数(options)传递给链接器ld 。如果options 中间有逗号,就将options分成多个选项,然后传递给链接程序。

3.2 nm命令


  • 有时候可能需要查看一个库中到底有哪些函数,nm命令可以打印出库中的涉及到的所有符号。库既可以是静态的也可以是动态的。nm列出的符号有很多,常见的有三种:
  • l  一种是在库中被调用,但并没有在库中定义(表明需要其他库支持),用U表示;
  • l  一种是库中定义的函数,用T表示,这是最常见的;
  • l  一种是所谓的弱态”符号,它们虽然在库中被定义,但是可能被其他库中的同名符号覆盖,用W表示。
  • $nm libhello.h

3.3 ldd命令

ldd命令可以查看一个可执行程序依赖的共享库,例如我们编写的四则运算动态库依赖下面这些库:

Linux命令(十二)制作静态库和共享库_目标文件_16