Skip to content

创建一个动态库文件

本文,我们将创建一个含有int add(int a, int b);方法的动态库,并用自己写的代码调用它。

创建动态库

新建文件add.h

c
int add(int a, int b);

add.h对函数进行了声明。

此文件是必须的,因为其他代码调用它时,在代码编译时需要add这个"函数的声明"。

新建文件add.c

c
#include "add.h"

int add(int a, int b) {
	return (a+b)%65535;
}

这个文件对add.h中的函数进行了具体实现。

编译add.c

bash
gcc -fPIC -c add.c -o add.o

在这里,-fPIC 选项是必要的,它生成位置无关代码(Position Independent Code),以便后续动态库链接。

生成动态库libadd.so(名字必须以lib开头,且后缀必须为.so

bash
gcc -shared -o libadd.so add.o

使用动态库

写一个简单的main.c来调用动态库libadd.so

c
#include <stdio.h>
#include "add.h"

int main() {
	printf("%d
", add(1,65535));
}

编译main.c

bash
gcc -I lib main.c -L lib -l add -o main
# -I lib 表示gcc要在lib目录下搜索头文件
# -L lib 表示gcc要在lib目录下搜索库文件(如果同时找到动态库libadd.so和静态库libadd.a,其规则为优先链接静态库)
# -l add 表示gcc要链接名为libadd的库
# -o main 表示gcc要生成名为main的文件

生成的可执行文件main中并没有libadd.so的内容,所以在执行main的时候,main需要在本地执行目录寻找名为libadd.so的库并将所需代码加载入内存中。

执行main

bash
LD_LIBRARY_PATH=lib ./main
# macOS使用DYLD_LIBRARY_PATH=lib ./main
# 这里环境变量是告诉./main要在lib下寻找库文件
# 也可以将库文件放入gcc默认目录下,如/usr/local/lib/

可以看到执行结果为1。

之前写的博客Cmake add_subdirectory() 使用其实也是将每个子目录构建成了一个静态库,最终去链接这些库,也因此实现了模块化、并行构建、不重复构建的好处。

链接