Step
- 编写动态库源文件
- 将动态库源文件编译链接生成动态库文件
- 在执行源文件中添加头文件声明
- 使用动态库文件
Step1:
…
Step2:
gcc/g++ -fPIC -shared -o [libname].so [sourcefile]
example:
gcc -fPIC -shared -o tlib.so tlib.c
这样就会生成一个tlib.so
的动态库文件
其中-fPIC
的含义是: Position Independent Code (位置无关代码)
Step3:
添加声明可以在单独的头文件中添加, 也可以直接在使用的源文件内添加
Step4:
gcc t.c -L. tlib.so
会生成一个默认的a.out
可执行文件
此时还有一个问题就是直接运行的话会报错:
应用程序找不到.so
文件
解决方法有两种, 一种是改系统文件, 另外一种是临时告诉shell动态库的路径
因为这个是测试用例, 介绍第二种
LD_LIBRARY_PATH=. ./a.out
执行此命令可以解决报错问题, 其中LD_LIBRARY_PATH=.
的含义是:
告诉shell, 库的路径在当前路径下(如果库放在别的路径, 将.
替换即可)
以上经验来自博客园
顺便: 第一次写了makefile
, 用作上述的动态库管理
make build: 生成动态库, 可执行文件
make doit: 执行程序(如果文件并不存在, 先生成文件)
make clean: 清除生成的文件
1 build: tlib.so a.out
2
3 tlib.so: tlib.c
4 gcc -fPIC -shared -o $@ $<
5
6 a.out: t1.c
7 gcc $< -L. tlib.so
8
9 doit: build
10 LD_LIBRARY_PATH=. ./a.out
11
12 file = tlib.so a.out
13 clean:
14 rm $(file)
书写makedile和核心就是搞清楚依赖关系
其中build
为创建动态库和可执行文件, 所以依赖于tlib.so
和a.out
而tlib.so
依赖于tlib.c
, a.out
依赖于t1.c
…
有一份make教程
上述所用到的基础makefile规则并不难理解, 这里不做赘述