创建一个动态库文件
本文,我们将创建一个含有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() 使用其实也是将每个子目录构建成了一个静态库,最终去链接这些库,也因此实现了模块化、并行构建、不重复构建的好处。