A. 易语言中的编译和静态编译有何区别
静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。而编译就是把可执行文件和支持库一起写出到外部,在需要的时候直接对其中一个支持库进行搜索某一条命令.
打个比方.
你家有6个罐子,里面分别放了1块,5块,10块,20块,50块,100块.
然后你出门的时候要带每一种钱各一个,所以就从这六个罐子里每个罐子都拿出一张钱.
这就是静态编译.
我再打个比方.
你家还是有6个罐子,里面分别放了1块,5块,10块,20块,50块,100块.
然后你出门的时候,还是想要都带一种,然后你就不是每个罐子里拿钱了,而是直接把整个罐子都带在了身上出门.
相比起来,静态编译要轻松,小巧了许多了.
lz 手打很累的 采纳吧
B. 动态链接,静态链接 动态编译,静态编译 动态链接库,静态链接库 这些两两间的区别是什么呢
有点儿乱……,分数少简单扼要的说说吧。
————————————
首先,传统的编译,也就是静态编译是把 源文件 翻译成目标文件,这个是一次性过程,也就是你所谓的静态编译。
后来的Java和.NET等语言,首先编译成中间形式,然后运行过程中根据需要编译成本地代码(注意这个过程不是一次性的,下次运行重新编译),这个就是JIT(即时编译)技术,从即时编译发展出了动态编译技术
————————————
(传统的)编译完成后,像C/C++、Fortran、汇编等语言,可以把多个目标文件合并到一个库文件中,这个就是静态库。比如常说的库函数printf就是libc里面的函数。
如果有了启动函数(main),main里面使用了printf,就可以通过静态链接技术,从libc中提取出printf所在的文件加入到可执行文件中,如果printf还需要其它函数,就继续搜索并加入列表,直到形成一个闭包。这个就是静态链接。
可是静态链接有个明显的缺点,如果每个程序都需要printf,那么printf这个函数的代码就会同时存在在每个程序中,这样也太占地方了吧。所以发明了动态连接技术,其实有两种形式。无论哪一种,都是首先记录下需要调用printf这个函数以及所在的动态库,等到运行的时候再加载动态库,从动态库中找到真正的printf去执行。
由于,动态链接技术需要一些额外的信息,传统的静态库是不具备的,这些额外信息主要是重复加载和卸载时所需要的一些代码,因此需要动态链接库。
C. vs2010为什么设置了静态编译还是需要dll文件才能运行exe
静态编译:就是在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖动态链接库。
编译方式:
第1种:
设置:
1、项目->配置属性->常规->MFC的使用:在静态库中使用MFC
2、项目 -> 配置属性->C/C++->代码生成->运行库 :选择 多线程调试(/MTd)。
编译时,选择的是debug,win32
然后执行编译生成方案,在该工程目录下的debug文件中,找到该.exe文件,即可在其他电脑运行。
第2种:
一般可以配置一下两项:
1.项目 -> 配置属性->常规->MFC的使用 :在静态库中使用MFC。
2.项目 -> 配置属性->C/C++->代码生成->运行库 :选择 多线程调试(/MT)。
编译时,选择的是release,win32(这个选择项在工具栏的debug选框中,一般我们使用debug方式)
D. linux动态库和静态库的区别
动态链接库和静态链接库一般是编译集成一系列的接口(函数)
在程序源代码编译完成后通过编译器编译并通过链接器与这些库进行链接
动态链接库与静态链接库的区别在于链接器在进行链接时静态库会被直接编译进程序里
而动态链接库并不会,我们这里将这些链接库称作依赖(动态库和静态库)
程序的运行需要这些依赖,程序在静态链接后该程序本身便已包含该依赖
而动态链接后的程序本身本不包含该依赖,这些依赖需要执行者自行安装进操作系统(动态库、运行时库)
程序运行时会动态地加载这些库
linux上动态库一般的后缀后为.so
静态库一般的后缀为.a
由于静态链接会直接将库编译进程序里所以静态编译后的程序相较于动态链接所要大
这就是因为静态链接会将链接库编译进程序里的原因,所以占用就要大了
出于这种原因,静态库不易于维护与更新,如果链接库中有实现有bug等需要更新则需要更新整个程序,因为静态库被编译进程序中了
但动态库就没有这种情况了,因为动态库是程序运行时动态加载的,所以我们只需要更新动态库而不需要更新所有依赖该库的程序(软件)
另一方面,很多程序的开发都会使用到相同的链接库,也就是很多程序(软件)会有相同的依赖
如果将这些依赖全部静态编译的话将会造成存储资源占用过多而造成资源浪费
而使用动态库的方式这些程序(软件)则可以共享一个链接库,而不需要每个程序都带一个链接库,这样就大大地减少了存储资源占用空间
E. 静态联编和静态编译
联编就是将模块或者函数合并在一起生成可执行代码的处理过程,同时对每个模块或者函数调用分配内存地址,并且对外部访问也分配正确的内存地址,它是计算机程序彼此关联的过程。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。
静态联编是指在编译阶段就将函数实现和函数调用关联起来,因此静态联编也叫早绑定,在编译阶段就必须了解所有的函数或模块执行所需要检测的信息,它对函数的选择是基于指向对象的指针(或者引用)的类型,C语言中,所有的联编都是静态联编,据我所知道的,任何一种编译器都支持静态联编(废话)。
动态联编是指在程序执行的时候才将函数实现和函数调用关联,因此也叫运行时绑定或者晚绑定,动态联编对函数的选择不是基于指针或者引用,而是基于对象类型,不同的对象类型将做出不同的编译结果。C++中一般情况下联编也是静态联编,但是一旦涉及到多态和虚拟函数就必须要使用动态联编了。下面将介绍一下多态。
多态:字面的含义是具有多种形式或形态。C++多态有两种形式,动态多态和静态多态;动态多态是指一般的多态,是通过类继承和虚函数机制实现的多态;静态多态是通过模板来实现,因为这种多态实在编译时而非运行时,所以称为静态多态。
什么是静态编译
静态编译,就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。
编辑本段静态编译与动态编译的区别
动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令。所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。
静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。所以其优缺点与动态编译的可执行文件正好互补。
F. 静态编译和动态编译有何不同
静态编译就是把库函数编译到你的程序里 这样编译的好处是 可以适应不同的平台 如果你是用window系统的话不建议用静态编译 因为这样会使你的代码量增大
动态编译就是不把库函数编译到你的程序里
G. 如何编译C/Fortran动态/静态链接库
首先,传统的编译,也就是静态编译是把 源文件 翻译成目标文件,这个是一次性过程,也就是你所谓的静态编译。
后来的Java和.NET等语言,首先编译成中间形式,然后运行过程中根据需要编译成本地代码(注意这个过程不是一次性的,下次运行重新编译),这个就是JIT(即时编译)技术,从即时编译发展出了动态编译技术
————————————
(传统的)编译完成后,像C/C++、Fortran、汇编等语言,可以把多个目标文件合并到一个库文件中,这个就是静态库。比如常说的库函数printf就是libc里面的函数。
如果有了启动函数(main),main里面使用了printf,就可以通过静态链接技术,从libc中提取出printf所在的文件加入到可执行文件中,如果printf还需要其它函数,就继续搜索并加入列表,直到形成一个闭包。这个就是静态链接。
可是静态链接有个明显的缺点,如果每个程序都需要printf,那么printf这个函数的代码就会同时存在在每个程序中,这样也太占地方了吧。所以发明了动态连接技术,其实有两种形式。无论哪一种,都是首先记录下需要调用printf这个函数以及所在的动态库,等到运行的时候再加载动态库,从动态库中找到真正的printf去执行。
由于,动态链接技术需要一些额外的信息,传统的静态库是不具备的,这些额外信息主要是重复加载和卸载时所需要的一些代码,因此需要动态链接库。
H. 易语言编译和静态编译的区别
1、库文件和程序文件不同,编译是把支持库文件和程序分开来,如果给别人去用,别人却没安装易语言,就要把支持库文件带上给那人才能用。但是静态编译是把支持库文件打包到程序里去.这样,如果对方没装易语言也照样可以正常使用和独立编译。
I. 怎样将自己做的动态链接库“静态”编译到可执行文件里
举例文件:add.c
gcc -fPIC -c add.c /生成.o文件
gcc -shared add.o -o libmath.so /加载add.o到math动态库
gcc test.c -L. -Lmath /test.c 为主程序
另外;配置动态库加载器环境变量:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
J. linux 动态链接和静态链接的区别
两者区别:a,静态库的使用需要:1包含一个对应的头文件告知编译器lib文件里面的具体内容2设置lib文件允许编译器去查找已经编译好的二进制代码b,动态库的使用:程序运行时需要加载动态库,对动态库有依赖性,需要手动加入动态库c,依赖性:静态链接表示静态性,在编译链接之后,lib库中需要的资源已经在可执行程序中了,也就是静态存在,没有依赖性了动态,就是实时性,在运行的时候载入需要的资源,那么必须在运行的时候提供需要的动态库,有依赖性,运行时候没有找到库就不能运行了d,区别:简单讲,静态库就是直接将需要的代码连接进可执行程序;动态库就是在需要调用其中的函数时,根据函数映射表找到该函数然后调入堆栈执行。做成静态库可执行文件本身比较大,但不必附带动态库做成动态库可执行文件本身比较小,但需要附带动态库链接静态库,编译的可执行文件比较大,当然可以用strip命令精简一下(如:striplibtest.a),但还是要比链接动态库的可执行文件大。程序运行时间速度稍微快一点。静态库是程序运行的时候已经调入内存,不管有没有调用,都会在内存里头。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。其在编译程序时若链接,程序运行时会在系统指定的路径下搜索,然后导入内存,程序一般执行时间稍微长一点,但编译的可执行文件比较小;动态库是程序运行的时候需要调用的时候才装入内存,不需要的时候是不会装入内存的。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。动态链接库的特点与优势首先让我们来看一下,把库函数推迟到程序运行时期载入的好处:1.可以实现进程之间的资源共享。什么概念呢?就是说,某个程序的在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。这样的模式虽然会带来一些“动态链接”额外的开销,却大大的节省了系统的内存资源。C的标准库就是动态链接库,也就是说系统中所有运行的程序共享着同一个C标准库的代码段。2.将一些程序升级变得简单。用户只需要升级动态链接库,而无需重新编译链接其他原有的代码就可以完成整个程序的升级。Windows就是一个很好的例子。3.甚至可以真正坐到链接载入完全由程序员在程序代码中控制。程序员在编写程序的时候,可以明确的指明什么时候或者什么情况下,链接载入哪个动态链接库函数。你可以有一个相当大的软件,但每次运行的时候,由于不同的操作需求,只有一小部分程序被载入内存。所有的函数本着“有需求才调入”的原则,于是大大节省了系统资源。比如现在的软件通常都能打开若干种不同类型的文件,这些读写操作通常都用动态链接库来实现。在一次运行当中,一般只有一种类型的文件将会被打开。所以直到程序知道文件的类型以后再载入相应的读写函数,而不是一开始就将所有的读写函数都载入,然后才发觉在整个程序中根本没有用到它们。静态库:在编译的时候加载生成目标文件,在运行时不用加载库,在运行时对库没有依赖性。动态库:在目标文件运行时加载,手动加载,且对库有依赖性。具体在开发中用到哪种库,我觉得还是根据实际的内存大小,ROM大小,运行的速度等综合考虑。