关于静态库和动态库的理解(C++)

库的存在,是软件模块化的基础。

库存在的意义:

} 库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议。
 
    } 现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。
 
    }
共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。带来好处的同时,也会有问题!如经典的DLL
Hell问题,这就要求在设计DLL时候应该向下兼容,然而要保证DLL完全向下兼容却是几乎不能的。

库有两种:静态库和共享库(动态库)。

静态库
      }静态库对函数库的链接是放在编译时期(compiletime)完成的。
 
    } 程序在运行时与函数库再无瓜葛,移植方便
      }
浪费空间和资源,因为所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable
file)。

共享库(动态库)
     
}动态库把对一些库函数的链接载入推迟到程序运行的时期(runtime)。
      }
可以实现进程之间的资源共享。
      } 将一些程序升级变得简单。
      }
甚至可以真正做到链接载入完全由程序员在程序代码中控制。

二者的不同点在于二进制代码被载入的时刻不同

l  静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库,因此体积较大

l  动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在,因此代码体积较小

Window与Linux执行文件格式不同,在创建动态库的时候有一些差异。

l  在Windows系统下的执行文件格式是PE格式,动态库需要一个DllMain函数做出初始化的入口,通常在导出函数的声明时需要有_declspec(dllexport)关键字

l  Linux下gcc编译的执行文件默认是ELF格式,不需要初始化入口,亦不需要函数做特别的声明,编写比较方便。

示例:

 1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5
6 class A
7 {
8 public:
9 virtual void a();
10 virtual void b();
11 void c();
12
13 };
14 class B:public A
15 {
16 public:
17 virtual void b();
18 void c();
19
20 };

trans.h

1 #include "trans.h"
2
3 void A::a(){cout<<"A::a is me ."<<endl;}
4 void A::b(){cout<<"A::b is me ."<<endl;}
5 void A::c(){cout<<"A::c is me ."<<endl;}
6
7 void B::b(){cout<<"B::b is me ."<<endl;}
8 void B::c(){cout<<"B::c is me ."<<endl;}

trans.cpp

 1 #include "trans.h"
2
3 int main() {
4 A* pa= new A;
5 A* pb= new B;
6 pa->a();
7 pa->b();
8 pa->c();
9
10 pb->a();
11 pb->b();
12 pb->c();
13
14 B b;
15 b.a();
16 b.b();
17 b.c();
18
19 return 0;
20 }

main.cpp

编译:

----------------------------------------------------------------------------

aix

xlC -G -o libct.so trans.cpp
xlC -brtl -o tt main.cpp -L./ -lct

hpux

aCC +z -b -o libct.sl  trans.cpp
aCC -o tt main.cpp -L./ -lct

----------------------------------------------------------------------------

参考:

http://www.cnblogs.com/skynet/p/3372855.html
C++静态库与动态库

http://tech.sina.com.cn/s/2005-02-21/1157530694.shtml
谈跨平台C++动态连接库实现

关于静态库和动态库的理解(C++),布布扣,bubuko.com

时间: 2024-10-16 12:17:16

关于静态库和动态库的理解(C++)的相关文章

Linux使用静态库和动态库

Linux使用静态库和动态库 (一)库的概念 库是可以复用的代码,在一些大的项目中常常会用到库. 本质上说:库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 一般说库是说两种: 静态库:linux下.a文件.windows下.lib文件 动态库:linux下.so文件.windows下.dll文件 最近花了一些时间把linux下编译.链接等研究了一下,作为一个菜鸟记录并分享一蛤. (二)静态库与动态库 程序的编译运行要经过以下步骤: 1.源文件(.h .cpp等) 2.预编译 3.编

静态库和动态库

简介 什么是库? 库是程序代码的集合,是共享程序代码的一种方式 根据源代码的公开情况,库可以分为2种类型 开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetworking 闭源库 不公开源代码,是经过编译后的二进制文件,看不到具体实现 主要分为:静态库.动态库 为什么制作闭源库 国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用 例如:百度地图,友盟,JPush等 在企业开发中,一些核心技术或者常用框架,出于安全性和稳

C++静态库与动态库(比较透彻)

这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自我修养——链接.装载与库>. 什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.库有两种:静态库(.a..lib)和动态库(.so..

(转)HelloWorld CMake CMake中构建静态库与动态库及其使用

继续完善Hello World,建立它的共享库, 包括静态库和动态库. 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello World字符串. 2,安装头文件与共享库. 3, 编写一个程序使用创建的共享库(静态库和动态库). cd /home/ccj/CMakeDemo mkdir t3   cd /backup/cmake/t3 mkdir lib   在t3目录下建立CMakeLists.txt,内容如下: PRO

静态库和动态库的区别

real framework中不可以使用类别 或 不可以不包含类文件 real framework 中直接调用NSClassFromString函数会返回null  需要强制加载指定类 或 直接通过类名引用 linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见

HelloWorld CMake Demo 03:CMake中构建静态库与动态库及其使用

? 继续完善Hello World,建立它的共享库, 包括静态库和动态库. ? 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello World字符串. 2,安装头文件与共享库. 3, 编写一个程序使用创建的共享库(静态库和动态库). ? 一,准备工作: 在/home/ccj/CMakeDemo目录建立t3目录,用于存放本节涉及到的工程. cd /home/ccj/CMakeDemo mkdir t3 ? 二,建立共享库

[转]vs2010 静态库以及动态库编译实例

转载地址:http://blog.csdn.net/wswxfwps/article/details/31788703 有网友留言,指出了本文中有错的地方,在此谢谢指摘. 重新编辑了一下本文,新添加了一些东西以及到目前为止对静态库和动态库的心得理解和心得,和大家分享 最近在研究ffmpeg,由于用c#开发,而ffmpeg采用的是c开发,因此打算先用c将ffmpeg的一些函数封装成库,在用c#来调用,花了一天时间(确实水平太低)写了几个vs2010下的静态库以及动态库的编译实例. 一.vs2010

静态库、动态库的区别汇总

real framework中不可以使用类别 或 不可以不包含类文件 real framework 中直接调用NSClassFromString函数会返回null  需要强制加载指定类 或 直接通过类名引用 linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见

(转)iOS静态库与动态库的区别

一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存. 三.iOS里静态库形式? .a和.framework 四.iOS里动态库形式? .dylib和.framework 五.framework为什么既是静态库又是动态库? 系统的.framework是动态库,我们自己建立的.framework是静态库. 六.a