casyup.me@outlook.com

0%

other/CreatesoFileinLinux

Step

  1. 编写动态库源文件
  2. 将动态库源文件编译链接生成动态库文件
  3. 在执行源文件中添加头文件声明
  4. 使用动态库文件

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.soa.out
tlib.so依赖于tlib.c, a.out依赖于t1.c

有一份make教程

上述所用到的基础makefile规则并不难理解, 这里不做赘述