静态编译、动态编译、静态链接库和动态链接库理解

1.静态编译:编译器在编译可执行文件时,把需要用到的对应动态链接库(.so或.ilb)中的部分提取出来,链接到可执行文件中去,
使可执行文件在运行时不需要依赖于动态链接库.

2.动态编译: 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令。所以其优点一

方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接

库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文

件就不能运行。

静态编译:
静态lib将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序。
动态编译:
动态lib相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,运行时

候需要相应的dll文件支持。

动态链接库:
创建一个动态链接库,会生成x.dll,x.lib
动态链接库有两种加载方式:
1.一种是静态加载,就是在编译的时候就载入动态链接库。此种方法可调用类方法.
可执行程序静态加载动态链接库需要三个文件 x.dll, x.lib, x.h
可执行程序的头文件加入:
#include "x.h"
#pragma comment(lib,"x.lib")
编译时还要附加库目录,防止程序编译时无法找到x.dll。

2.动态加载
只需要x.dll文件。
在程序执行需要该动态链接库的地方加载x.dll。
然后获取需要的x.dll库里面的函数或数据.
该方法不能调用类方法.

可执行程序调用了动态链接库,其运行不能缺少动态链接库.

静态链接库:
创建一个静态链接库,会生成x.lib文件
想要调用静态链接库里面的内容需要x.lib文件和x.h文件
库中内容会直接编译到x.exe文件中。
可执行程序使用静态库编译成x.exe后,x.exe的运行就不在需要静态链接库了,可以独立运行了。

一般的静态编译可以理解为加载静态链接库;动态编译理解我加载动态链接库。
静态链接库中不能包含其他库,动态链接库中能包含其他库。

时间: 2024-10-19 22:41:12

静态编译、动态编译、静态链接库和动态链接库理解的相关文章

简单程序的编译链接三种方法(编译多个源文件,静态链接库、动态链接库)

一个程序简单的程序如下: 1 hello.h #ifndef HELLO_H#define HELLO_H void hello(const char *name); #endif 2 hello.c #include <stdio.h>#include <stdlib.h> void hello(const char *name){ printf("hello %s\n",name);} 3 main.c #include <stdio.h>#in

关于静态与动态编译arm平台程序的比较

由于最近弄个console程序,调用了readline,ncurses库,这两个动态库加起来有四百多k,而程序其实很小,其他地方也没使用到这两个库 所以想静态编译看看console程序有多大. #arm-linux-gcc cli.c -o console libreadline.a  libncurses.a #ls -l total 1932 -rwxrwxr-x 1 root root   8427 Jul  7 15:19 cli -rw-r--r-- 1 root root   664

[C] linux静态链接库与动态链接库详解

http://blog.chinaunix.net/u2/76292/showart.php?id=1274181 一顺便说说了哦  通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file).程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下.所以这些函数库被成为静态库(static libaray),通常文件名为"libxx

Linux下 静态链接库 和 动态链接库

先来说说C/C++编译过程 编译: 检查语句符号定义,将C/C++代码翻译生成中间语言. 链接: 将中间代码整合,生成可执行的二进制代码. 简单的说,库文件都是一种特殊的中间语言文件,静态库还是一种特殊格式的归档文件(打包的文件). 使用静态库: 1. 先编写库函数 1 #ifndef _PRINT_TEST_H_ 2 3 #define _PRINT_TEST_H_ 4 #ifdef __cplusplus 5 extern "C" 6 { 7 #endif 8 9 extern i

C语言之静态链接库和动态链接库

1:静态链接库 比较早出现的是静态链接库.静态库其实就是商业公司将自己的函数库源代码经过只编译不连接形成.o的目标文件,然后用ar工具将.o文件归档成.a的归档文件(.a的归档文件又叫静态链接库文件).商业公司通过发布.a库文件和.h头文件来提供静态库给客户使用:客户拿到.a和.h文件后,通过.h头文件得知库中的库函数的原型,然后在自己的.c文件中直接调用这些库文件,在连接的时候链接器会去.a文件中拿出被调用的那个函数的编译后的.o二进制代码段链接进去形成最终的可执行程序. 2:动态链接库 动态

静态链接库和动态链接库的区别及优缺点

动态链接库和静态链接库的区别 本文参考了以下博客:      1. http://blog.csdn.net/gamecreating/article/details/5504152      2. http://blog.csdn.net/left_la/article/details/12098545      3. http://blog.csdn.net/augusdi/article/details/6460415 静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序

介绍静态链接库和动态链接库的区别,及在VC++6.0中的建立和使用

首先介绍一下链接库:链接库分为动态链接库和静态链接库两种 LIB是静态链接库,在程序编译连接的时候是静态链接,其对应的文件格式是.lib.即当程序采用静态链接库的时候,.lib文件中的函数被链接到最终的可执行文件中,因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行. DLL是动态链接库,在程序运行的时候被调用,其对应的文件的格式是.dll.即当程序采用动态链接的时候,.dll文件中的函数并没有被链接到可执行文件中,可执行文件只是保存了函数的地址信息.但是

[C++] 静态链接库和动态链接库的区别

静态链接库和动态链接库的区别 一.静态链接库 预编译->编译->汇编->链接 Linux: 生成目标文件 g++ -c source.cpp -o source.o 打包成静态链接库 ar -crv source.a source.o 使用静态链接库 g++ test.cpp -L静态链接库目录 -l静态链接库名称没有后缀 二.动态链接库 使用动态链接库是为了规避静态链接库的两个问题. 一个是多个副本的问题,对于静态库都是在编译时刻将其编译到源代码当中,在运行时刻不会再和静态库有任何关系

35.静态链接库和动态链接库

35.1.函数库的前世今生 (1)函数库就是一些事先写好的函数的集合,因为函数是模块化的,因此可以被复用:我们写好了某个函数,可以被反复使用,譬如A写好了某个函数然后共享出来,当B有相同的需求时就不需自己写直接用A写好的这个函数即可. (2)最开始是没有函数库的,每个人写程序都要从零开始自己写,时间长了慢慢的早期的程序员就积累下来了一些有用的函数:早期的程序员经常参加行业聚会,在聚会上大家互相交换各自的函数库:后来程序员中的一些大神就提出把大家各自的函数库收拢在一起,然后经过校准和整理,最后形成