Jialong's Blog
沉潜 自由 追寻幸福
动态库和静态库实操

之前在学习csapp的 链接 章节时学习了静态库和动态库的相关内容,但并没有在实际的开发中实践过。最近在公司开始接触项目后遇到一些编译时链接动态库相关内容,不太熟悉,所以在这里总结一下。

静态库的制作和使用

文件结构如下图所示:

.
├── include
│   └── calculate.h
├── lib
│   └── libcalculate.a
├── main
├── main.c
└── src
    ├── add.c
    ├── add.o
    ├── multiple.c
    └── multiple.o

其中各个文件的内容如下所示:

  • calculate.h
int add(int,int);
int multiple(int,int);
  • add.c
#include "calculate.h"

int add(int a, int b)
{
    return a + b;
}
  • multiple.c
#include "calculate.h"

int multiple(int a, int b)
{
    return a * b;
}
  • main.c
#include <stdio.h>
#include "calculate.h"

int main()
{
    printf("2 + 3 = %d\n", add(2, 3));
    printf("2 * 3 = %d\n", multiple(2, 3));
    return 0;
}

编译生成二进制.o文件

.o文件是库的原型。

cd src
gcc *.c -c -I ../include/
  • -I指定了头文件的搜索路径

  • -c只编译,不链接

打包.o文件

ar rcs libcalculate.a *.o

然后将得到的静态库移动到./lib目录下。

静态库的使用

main.c中使用这个编译好的静态库。

cd ../
gcc main.c -I ./include/ -L ./lib -l caculate -o main

gcc中使用到的参数有:

  • -I : 指定头文件

  • -L : 指定库文件位置

  • -l : 指定库的名称,库的名称结构为lib库名称.a

动态库的制作和使用

生成.o文件

在src目录下制作.o文件:

gcc *.c -c -fpic -I ../include/
  • -fpic参数代表用来生成与位置无关的文件

打包.o文件

gcc -shared -o libmycalculate.so *.o
  • -shared代表生成动态库

动态库的使用

gcc -I ./include/ -L ./lib/ -l mycaculate main.c -o main

此时我们需要配置动态库使得操作系统在运行可执行文件的时候可以找到它。

ld.so.conf.d/*.conf的配置文件中添加该动态库的路径,保存后使用ldconfig命令使配置生效。

参考


最后修改于 2022-07-17