博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编译生成动态库时,被关联的静态库会被编译到动态库里面。
阅读量:4153 次
发布时间:2019-05-25

本文共 1532 字,大约阅读时间需要 5 分钟。

转载: http://hi.baidu.com/proinsight/item/150dd3e6e506d1a9c10d7552

动态库调用静态库.

生成动态库: 需要的目标文件得用-fPIC选项生成.

而静态库所需的目标文件可以不用-fPIC选项.

一个应用程序调用动态库, 而这个动态库其中的函数调用某静态库时,如何生成应用程序呢?

例:

/// static.h

void static_print();

///static.cpp

#include <iostream>

#include "static.h"

void static_print() {

     std::cout<<"This is static_print function"<<std::endl;

}

// shared.h

void shared_print();

// shared.cpp

#include <iostream>

#include "shared.h"

#include "static.h"

void shared_print() {

       std::cout<<"This is shared_print function";

        static_print();

}

test.cpp

   #include "share.h"

  
int main()
{
       shared_print();
       return 0;
   }

方法一:

      静态库的.o文件也用-fPIC生成. 生成动态库时把静态库加入.

     生成应用程序时只加载动态库

     g++ -c -fPIC static.cpp // 生成static.o

     ar -r libstatic.a static.o // 生成静态库libstatic.a

     g++ -c -fPIC shared.cpp // 生成shared.o

     g++ -shared shared.o -lstatic -o libshared.so   // 生成动态库libshared.so 注: -shared是g++的选项,与shared.o无关. -lstatic选项把libstatic.a的函数加入动态库中.

     g++ test.cpp -lshared -o test.exe // link libshared.so 到test.exe中.

方法二:

     静态库的.o文件不用-fPIC生成. 生成动态库时不加静态库.

    生成应用程序时加载动态库和静态库.

     g++ -c static.cpp // 生成static.o

     ar -r libstatic.a static.o // 生成静态库libstatic.a

     g++ -c -fPIC shared.cpp // 生成shared.o

     g++ -shared shared.o -o libshared.so // 生成动态库libshared.so 注: -shared是g++的选项,与shared.o无关. 这时如果加-lstatic. error:relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC

     g++ test.cpp -lshared -lstatic -o test.exe // link libshared.so 到test.exe中.

两种方法的不同之处在于static_print的实际代码一个在.so中.一个在最后test.exe文件中. 个人觉得第一种方法更好, 因为动态库应该看成一个可以独立运行的程序.

你可能感兴趣的文章
求二叉树中结点的最大值(所有结点的值都是正整数)
查看>>
用go的flag包来解析命令行参数
查看>>
来玩下go的http get
查看>>
队列和栈的本质区别
查看>>
matlab中inline的用法
查看>>
如何用matlab求函数的最值?
查看>>
Git从入门到放弃
查看>>
java8采用stream对集合的常用操作
查看>>
EasySwift/YXJOnePixelLine 极其方便的画出真正的一个像素的线
查看>>
Ubuntu系统上安装Nginx服务器的简单方法
查看>>
Ubuntu Linux系统下apt-get命令详解
查看>>
ubuntu 16.04 下重置 MySQL 5.7 的密码(忘记密码)
查看>>
Ubuntu Navicat for MySQL安装以及破解方案
查看>>
HTTPS那些事 用java实现HTTPS工作原理
查看>>
oracle函数trunc的使用
查看>>
MySQL 存储过程或者函数中传参数实现where id in(1,2,3,...)IN条件拼接
查看>>
java反编译
查看>>
Class.forName( )你搞懂了吗?——转
查看>>
jarFile
查看>>
EJB与JAVA BEAN_J2EE的异步消息机制
查看>>