导航:首页 > 源码编译 > 静态编译和动态编译区别和优缺点

静态编译和动态编译区别和优缺点

发布时间:2022-06-08 19:02:42

❶ 动态链接,静态链接 动态编译,静态编译 动态链接库,静态链接库 这些两两间的区别是什么呢

有点儿乱……,分数少简单扼要的说说吧。
————————————
首先,传统的编译,也就是静态编译是把 源文件 翻译成目标文件,这个是一次性过程,也就是你所谓的静态编译。
后来的Java和.NET等语言,首先编译成中间形式,然后运行过程中根据需要编译成本地代码(注意这个过程不是一次性的,下次运行重新编译),这个就是JIT(即时编译)技术,从即时编译发展出了动态编译技术
————————————
(传统的)编译完成后,像C/C++、Fortran、汇编等语言,可以把多个目标文件合并到一个库文件中,这个就是静态库。比如常说的库函数printf就是libc里面的函数。
如果有了启动函数(main),main里面使用了printf,就可以通过静态链接技术,从libc中提取出printf所在的文件加入到可执行文件中,如果printf还需要其它函数,就继续搜索并加入列表,直到形成一个闭包。这个就是静态链接。
可是静态链接有个明显的缺点,如果每个程序都需要printf,那么printf这个函数的代码就会同时存在在每个程序中,这样也太占地方了吧。所以发明了动态连接技术,其实有两种形式。无论哪一种,都是首先记录下需要调用printf这个函数以及所在的动态库,等到运行的时候再加载动态库,从动态库中找到真正的printf去执行。
由于,动态链接技术需要一些额外的信息,传统的静态库是不具备的,这些额外信息主要是重复加载和卸载时所需要的一些代码,因此需要动态链接库。

❷ 配置linux内核的时候,驱动的静态编译和动态编译有什么区别

驱动的动态编译会生成.ko文件,系统启动后需要加载该驱动后才能使用相应设备。
而静态编译则直接编译进内核,系统启动的时候会自动加载该驱动。
静态编译太多驱动至内核,会导致内核体积过大,启动时间较长。而动态编译则比较自由灵活,需要用的时候即加载,不需要的时候即卸载。我以前在EasyARM-iMX280的学习手册里看到写得很清楚,你可以去看看的。

❸ 什么是静态编译,什么是动态编译,以及他们的区别

后者容易扩充,前者运行效率高,但一旦有更新,要全部重新编译

❹ 在linux系统中,静态编译和动态编译哪个速度快的

你说的静态库和动态库吧?编译速度没有太大的区别,在实际运行时,静态库运行较快,而动态库内地函数由于在实际使用到时才加载到内存,所以运行较慢。动态库的好处是只要保持接口不变,就可以在程序运行时进行动态库的切换。

❺ 静态编译和动态编译有何不同

静态编译与动态编译的区别:
1、动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令
所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。
缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。
2、静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。所以其优缺点与动态编译的可执行文件正好互补。

❻ 易语言编译和静态编译的区别

1、库文件和程序文件不同,编译是把支持库文件和程序分开来,如果给别人去用,别人却没安装易语言,就要把支持库文件带上给那人才能用。但是静态编译是把支持库文件打包到程序里去.这样,如果对方没装易语言也照样可以正常使用和独立编译。

❼ linux 静态库和动态库编译的区别

Linux库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so libhello.a
为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。
ln -s libhello.so.1.0 libhello.so.1
ln -s libhello.so.1 libhello.so

动态库和静态库的区别:
当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记‘指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。

两种库的编译产生方法:
第一步要把源代码编绎成目标代码。以下面的代码hello.c为例,生成hello库:

/* hello.c */
#include
void sayhello()
{
printf("hello,world\n");
}
用gcc编绎该文件,在编绎时可以使用任何全法的编绎参数,例如-g加入调试代码等:
gcc -c hello.c -o hello.o
1.连接成静态库
连接成静态库使用ar命令,其实ar是archive的意思
$ar cqs libhello.a hello.o
2.连接成动态库
生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:
$gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o
另外再建立两个符号连接:
$ln -s libhello.so.1.0 libhello.so.1
$ln -s libhello.so.1 libhello.so
这样一个libhello的动态连接库就生成了。最重要的是传gcc -shared 参数使其生成是动态库而不是普通执行程序。
-Wl 表示后面的参数也就是-soname,libhello.so.1直接传给连接器ld进行处理。实际上,每一个库都有一个soname,当连接器发现它正在查找的程序库中有这样一个名称,连接器便会将soname嵌入连结中的二进制文件内,而不是它正在运行的实际文件名,在程序执行期间,程序会查找拥有 soname名字的文件,%B

❽ 浅谈静态联编和动态联编的区别和实现动态联编的

联编是指一个程序自身彼此关联的过程。按照联编所进行的阶段不同,可分为静态联编和动态联编。
静态联编又称静态绑定,指在调用同名函数(即重载函数)时编译器将根据调用时所使用的实参在编译时就确定下来应该调用的函数实现。它是在程序编译连接阶段进行联编的,这种联编又称为早期联编,这是因为这种联编工作是在程序运行之前完成的。它的优点是速度快,效率高,但灵活性不够。
编译时所进行的联编又称为静态束定。束定是指确定所调用的函数与执行该函数代码之间的关系。
动态联编也称动态绑定,是指在程序运行时,根据当时的情况来确定调用的同名函数的实现,实际上就是在运行时选择虚函数的实现。这种联编又称为晚期联编或动态(束定。实现条件:①要有继承性且要求创建子类型关系;)②要有虚函数;③通过基类的对象指针或引用访问虚函数。继承是动态联编的基础,虚函数是动态联编的关键,虚函数经过派生之后,在类族中就可以实现运行过程中的多态。动态联编要求在运行时解决程序中的函数调用与执行该函数代码间的关系,调用虚函数的对象是在运行时确定的。对于同一个对象的引用,采用不同的联编方式将会被联编到不同类的对象上。即不同联编可以选择不同的实现,这便是多态性。它的优点是灵活性强,但效率较低。

❾ 易语言里面一般用静态编译还是用动态编译用哪种好! 详解谢谢 我是个新手越详细月好! 多谢啦!

我喜欢用静态编译,因为会打包为一个EXE文件,非常方便,而且它生成的静态编译EXE是仿C++的格式,因此很多杀毒软件不会查杀,防止了误报.
但有些支持库不支持静态编译,这时,只好使用动态编译了,而用动态编译后,要将所用到的支持库文件都拷贝到EXE同在的目录中,最后用INNO SETUP打包发布才行.

❿ 在易语言里,什么叫做静态编译,什么叫做动态编译那可以生成安装包的是什么编译具体见补充

静态编译生成的文件可以共享给大家用
动态编译生成的文件只能共享给安装有易语言的人使用
这样回答够简单了

阅读全文

与静态编译和动态编译区别和优缺点相关的资料

热点内容
linuxx264编译 浏览:343
华夏银行网银盾用什么app 浏览:583
单片机栈区 浏览:64
直流马达如何连接5v单片机 浏览:261
后缀为win的文件怎么解压 浏览:802
压缩包解压后为什么一张白纸 浏览:585
服务器和云盒子 浏览:172
python画cad电气图 浏览:419
三菱plcfx3sa编程电缆 浏览:314
山西视频加密防盗 浏览:839
华为mml命令查看用户量 浏览:907
场论朗道pdf 浏览:373
如何使用qtquick编译器 浏览:50
山西高配服务器云服务器 浏览:744
为什么编译按f9没反应 浏览:122
购物app都适合买什么东西 浏览:277
savetxt函数python 浏览:577
编译器小端改大端 浏览:642
华为安卓哪些文件夹能删除 浏览:406
手机samp服务器地址 浏览:209