gcc,c++ 动态库调用静态库

转载 2013年12月05日 07:49:54

生成动态库: 需要的目标文件得用-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文件中. 个人觉得第一种方法更好, 因为动态库应该看成一个可以独立运行的程序.

GCC 编译使用动态链接库和静态链接库的方法

1 库的分类 根据链接时期的不同,库又有静态库和动态库之分。 静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。 有别于静态库,动态库的链接是在程...
  • yuan1164345228
  • yuan1164345228
  • 2015年06月04日 09:29
  • 3255

Linux下gcc生成和使用静态库和动态库详解

Linux下gcc生成和使用静态库和动态库详解(原文链接) 本文在原文的基础上做一些详细验证,部分稍有改动, 一、基本概念 1.1什么是库 1.2库的种类 1.3库存在的意义 1.4库文件是如何...
  • CSqingchen
  • CSqingchen
  • 2016年05月31日 17:54
  • 5631

GCC同时使用静态库和动态库链接

一 在应用程序需要连接外部库的情况下,linux默认对库的连接是使用动态库,在找不到动态库的情况下再选择静态库。使用方式为: gcc test.cpp -L. -ltestlib 如果当前目录有...
  • wangzhen209
  • wangzhen209
  • 2015年07月30日 17:14
  • 7428

使用gcc建立并调用静态库与动态库

  • 2012年01月10日 08:41
  • 2KB
  • 下载

gcc静态库与动态库生成

  • 2015年01月09日 03:12
  • 8KB
  • 下载

GCC_生成静态库和动态库.pdf

  • 2012年05月26日 22:33
  • 12KB
  • 下载

gcc生成静态库和动态库

  • 2009年07月30日 09:59
  • 99KB
  • 下载

gcc生成静态库和动态库

  • 2012年03月30日 10:40
  • 30KB
  • 下载

Linux下Gcc生成和使用静态库和动态库详解

  • 2013年01月07日 18:00
  • 249KB
  • 下载

Linux下gcc编译器生成和使用静态库和动态库学习笔记

我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是...
  • arackethis
  • arackethis
  • 2015年01月31日 12:16
  • 2343
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:gcc,c++ 动态库调用静态库
举报原因:
原因补充:

(最多只允许输入30个字)