在Linux下用libuv静态库编译成我需要的动态库

一、目标

我是想通过libuv.a这个静态库与当前的三个源文件:tnet.cSample.cring_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命令使该文件立即生效。
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值