调用静态库生成动态库并使用

最近研究了一下动态库和静态库调用的问题,本篇文字是在生成动态库的时候调用静态库,并使用动态库编译成可执行程序。不足之处还望多多指教。

1、首先写了一个简单的接口编译成静态库(.h文件和.cpp文件如下)

//hello.h
#include <stdio.h>

bool show (int date);
//hello.cpp
#include <stdio.h>
#include <hello.h>

bool show (int date)
{
        printf("date: %d\n", date);
        return true;
}
将hello.cpp编译成静态库:
zbq@wei-System-Product-Name:/partition6/practice/makelib$ g++ -fPIC -c hello.cpp -I./
zbq@wei-System-Product-Name:/partition6/practice/makelib$ ar -rs libhello.a hello.o 
ar: 正在创建 libhello.a

在编译libhello.a静态的时候需要加 -fPIC选项,以预防后面编译的时候报错

2、下面的接口编译成动态库(含有.h和.cpp文件)

//add_test.h
#include <hello.h>
#include <add_test.h>

int add (int a, int b);
//add_test.cpp
#include <stdio.h>

int add (int a, int b)
{
        show(a + b);
        return 0;
}
zbq@wei-System-Product-Name:/partition6/practice/makelib$ g++ -fPIC -shared -o libadd.so add_test.cpp  -I./ -Wl,--whole-archive ./libhello.a -Wl,--no-whole-archive

执行上面命令则可以生成libadd.so动态库,通过使用 -Wl,--whole-archive 和 -Wl,--no-whole-archive选项可以将静态库发包成动态库,否则在动态库中没有任何的动态信息,后面使用该动态库的时候也会报错,错误信息有可能像下面一样:

zbq@wei-System-Product-Name:/partition6/practice/makelib$ g++ main.cpp -I./ -L./ -ladd  -o test
/tmp/cccNffNF.o:在函数‘main’中:
main.cpp:(.text+0xf):对‘add(int, int)’未定义的引用
main.cpp:(.text+0x1e):对‘add(int, int)’未定义的引用
collect2: error: ld returned 1 exit status

3、编写main.cpp调用libadd.so

//main.cpp
#include <stdio.h>
#include <add_test.h>

int main (void)
{
        add(1, 6);
        add(6, 1);
        return 0;
}
zbq@wei-System-Product-Name:/partition6/practice/makelib$ g++ main.cpp -o test -I./ -L./ -ladd 

编译通过执行test

zbq@wei-System-Product-Name:/partition6/practice/makelib$ ./test 
./test: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory

动态库的使用在执行的时候首先程序会按照默认共享库路径(/user/lib/)中找是否有该库,当该库不存在的时候就报该错,所有虽然编译好了该可执行的文件,但是由于库的问题不能执行,解决办法

sudo ln -sf /partition6/practice/makelib/libadd.so /usr/lib/libadd.so

执行上面命令,在默认的路径中链接该动态库即可

执行结果:

zbq@wei-System-Product-Name:/partition6/practice/makelib$ ./test 
date: 7
date: 7

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值