一、目标
我是想通过
libuv.a
这个静态库与当前的三个源文件:tnet.c
、Sample.c
、ring_buf.c
一起编译成动态库。
二、过程
1. 编译libuv
源码生成libuv.a
静态库
下面第一步和第三步的目的是在生成静态库时添加-fPIC
这个参数,因为后面生成动态库的时候需要添加这个参数,如果生成的静态库没有添加这个参数,后面生成动态库时会报错。
- 在
libuv
源码根目录执行configure --with-gnu-ld --with-pic
make
- 在根目录的
libuv.la
配置文件中修改dependency_libs
依赖项,添加-fPIC
参数,如果是32位系统,还应该加上-ldl
参数,该配置文件只有在make
后才会生成; make install
- 编译完成后生成的静态库与动态库都会放在
/usr/local/lib/
目录下。
2.编译生成动态库
- 将上一步生成的
libuv.a
文件拷到三个源文件处; - 执行下述命令编译生成的动态库,
-I
参数指定头文件目录,里面放了libuv
的头文件和我三个源文件的头文件,-L
参数指定静态库目录,-luv
指定了libuv.a
这个静态库,-lpthread
指定系统多线程库,因为libuv
里边用到了。
gcc tnet.c Sample.c ring_buf.c -shared -fPIC -o libSample.so -I include/ -L. -luv -lpthread
3、验证动态库
- 用
ldd libSample.so
查看该动态库依赖,发现没有依赖了,可以拿到另一台机器上使用; - 用
nm -D libSample.so
查看动态库中的接口函数,是否已经包含了所需API
; - 编写测试文件调用动态库中的
API
,用gcc test.c -L. -lSample -o test
编译测试文件,能够正常运行; - 这时可能会报错找不到该动态库,原因是没有配置环境变量,可以用
//冒号后面跟着我们动态库的目录
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/zxh/sample
- 也可以通过在
/etc/profile
文件中加上上面那一行,再用source /etc/profile
命令使该文件立即生效。