导航:首页 > 源码编译 > 简述静态编译和动态编译的区别

简述静态编译和动态编译的区别

发布时间:2025-03-27 20:11:51

1. 什么是静态联编,什么是动态联编

静态联编是指在编译时确定的函数调用关系,而动态联编则是在运行时根据对象的实际类型来确定调用哪个函数。

静态联编,也称为早期绑定或静态绑定,是指在程序编译阶段就已经确定了函数或方法的调用关系。在C++中,静态联编通常与非虚函数相关。编译器在编译时就能根据函数名和参数列表匹配到具体的函数调用。例如,如果我们有一个基类Shape和一个派生类Circle,Shape中有一个非虚的draw函数,当我们通过Shape类型的指针调用draw函数时,无论这个指针实际指向的是Shape对象还是Circle对象,调用的都是Shape中的draw函数,这就是静态联编的一个例子。

动态联编,也称为晚期绑定或动态绑定,是指在程序运行时根据对象的实际类型来确定调用哪个函数。在C++中,这通常与虚函数相关。当基类中的函数被声明为虚函数时,编译器会在运行时通过虚函数表来确定应该调用哪个类的函数实现。继续上面的例子,如果Shape中的draw函数被声明为虚函数,那么当我们通过Shape类型的指针调用draw函数时,如果指针实际指向的是Circle对象,就会调用Circle中的draw函数实现,这就是动态联编的一个例子。

总的来说,静态联编和动态联编的主要区别在于函数调用的确定时机和方式。静态联编在编译时就已经确定了函数调用关系,而动态联编则在运行时根据对象的实际类型来确定。这两种方式各有优缺点,静态联编具有较高的执行效率,但灵活性较差;而动态联编虽然会带来一定的性能开销,但它支持多态性,使得程序能够更加灵活和可扩展。在实际编程中,我们需要根据具体需求来选择使用哪种联编方式。

2. 动态编译和静态编译有何主要区别

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

3. 怎样区别APACHE动态和静态编译

关于apache的动态与静态编译的理解,引用某人的比喻如下:
好比有两个人a和m,a代表apache,m代表mole,要想让a使用m的东西,一个方法是把m的东西都放到a那里去,a使用的时候就是现成的了,就是所谓的静态编译
还有一个方法,就是告诉a,m的住址,当a要使用m的东西的时候,a去找m,然后使用,不过,这种方法要注意的一个问题就是:m必须要有实际的住址,否则a会找不到m而产生错误的,这种方法也就是apache 的动态(DSO)编译了。
下面说说在apache1.3和apache2.0动态与静态编译编译的区别
首先是apache1.3.29+php4.3.4+mysql4.0.13的静态编译
apache第一次编译,并不要安装,因为php的编译需要apache至少已经编译过一次
tar zvxf apache_1.3.27.tar.gz
cd apache_1.3.27
./configure --prefix=/usr/local/apache
编译php
tar zvxf php4.3.4.tar.gz
cd php4.3.4
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-apache=../apache_1.3.27
make
make install
第二次编译安装apache:
cd ../apache_1.3.29
./configure --prefi=/usr/local/apache --activate-mole=src/moles/php4/libphp4.a
make
make install
cp ../php4.3.4/php.ini.dist /usr/local/php/lib/php.ini

修改/usr/local/apache/conf/httpd.conf
查找<IfMole mod_mime.c>
在此范围添加
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
注意:apache和php的源码包在同一个目录,--with-apache=../apache_1.3.27是指向源码解压的目录
ok!静态编译完成。
再看DSO动态编译方法:
首先编译安装apache
tar zvxf apache_1.3.29
cd apache_1.3.29
./configure --prefix=/usr/local/apache --enable-mole=so --enable-mole=rewrite --enable-shared=max
make
make install
so模块用来提供DSO支持的apachehe核心模块,rewrite是地址重写的模块,如果不需要可以不编译enable-shared=max是指除了so以外的所有标准模块都编译成DSO模块。

然后编译php
tar zvxf php4.3.4.tar.gz
cd php4.3.2
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-apxs=/usr/local/apache/bin/apxs
make
make install
然后修改httpd.conf,方法同静态编译的方法
OK,DSO动态编译就完成了!

接下来我们讲apache2.0.46+php4.3.2的动态编译方法
一样先编译安装apache
tar zvxf httpd-2.0.46.tar.gz
cd httpd-2.0.46
./configure --prefix=/usr/local/apache2 --enable-so --enable-mods-shared=most
make
make install

大家注意了--enable-so相当与1.3.27的--enable-mole=so,而--enable-mods-shared=most又等同与以前的--enable-shared=max
然后还是编译PHP
tar zvxf php4.3.2.tar.gz
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-apxs2=/usr/local/apache2/bin/apxs
make
make install
注意这里是apxs2!!
修改httpd.conf与1.3.27也有所不同,大家寻找Add Type application/x-tar .tgz 在下面添加
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
另外要显示中文的话,请修改:
AddDefaultCharset gb2312

阅读全文

与简述静态编译和动态编译的区别相关的资料

热点内容
两个pdf文件怎么合并 浏览:847
域名查所在服务器地址 浏览:259
android股票开发 浏览:352
行业主流单片机 浏览:532
程序员敲代码必备 浏览:278
星火英语四级pdf 浏览:935
app代理在哪里找 浏览:188
python的ide哪个好 浏览:792
Python二维矩阵数据画图 浏览:656
扫描仪怎么扫成pdf 浏览:803
羽毛球比赛视频app哪个好 浏览:877
舰长拒绝执行命令被免职 浏览:272
零向量的运算法则 浏览:491
中信app指纹登录怎么设置 浏览:241
百度地图瓦片算法 浏览:224
物流清单结构周期算法 浏览:1000
热压缩海绵枕芯枕头 浏览:551
3U源码编译不过 浏览:140
原生安卓如何看运行内存 浏览:381
冷水机组压缩机机油可以不加热吗 浏览:182