导航:首页 > 源码编译 > 只有动态链接库能编译吗

只有动态链接库能编译吗

发布时间:2023-06-19 09:25:59

‘壹’ 介绍静态链接库和动态链接库的区别,及在VC+

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。

静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。动态库就是在需要调用其中的函数时,根据函数映射表找到该函数然后调入堆栈执行。如果在当前工程中有多处对dll文件中同一个函数的调用,那么执行时,这个函数只会留下一份拷贝。但是如果有多处对lib文件中同一个函数的调用,那么执行时,该函数将在当前程序的执行空间里留下多份拷贝,而且是一处调用就产生一份拷贝。

静态链接库与静态链接库调用规则总体比较如下:

1、静态链接库(比较简单):

首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。生成库的.h头文件中的声明格式如下:

extern "C"函数返回类型函数名(参数表);

在调用程序的.cpp源代码文件中如下:

#include "../lib.h"

#pragma comment(lib,"..//debug//libTest.lib")//指定与静态库一起链接

其次因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!

静态链接库(Lib)

在VC++6.0中new一个名称为libTest的static library工程,并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下:

//文件:lib.h

#ifndef LIB_H

#define LIB_H

extern "C" int add(int x,int y);//声明为C编译、连接方式的外部函数

#endif


//文件:lib.cpp

#include "lib.h"

int add(int x,int y)

{ return x + y; }

编译这个工程就得到了一个.lib文件,这个文件就是一个函数库,它提供了add的功能。将头文件和.lib文件提交给用户后,用户就可以直接使用其中的add函数了。
标准Turbo C2.0中的C库函数(我们用来的scanf、printf、memcpy、strcpy等)就来自这种静态库。
下面来看看怎么使用这个库,在libTest工程所在的工作区内new一个libCall工程。libCall工程仅包含一个main.cpp文件,它演示了静态链接库的调用方法,其源代码如下:

#include <stdio.h>

#include "../lib.h"//不可丢失

#pragma comment( lib, "..//debug//libTest.lib" ) //指定与静态库一起连接

int main(int argc, char* argv[])

{ printf( "2 + 3 = %d", add( 2, 3 ) ); }

静态链接库的调用就是这么简单,或许我们每天都在用,可是我们没有明白这个概念。代码中#pragma comment( lib , "..//debug//libTest.lib" )的意思是指本文件生成的.obj文件应与libTest.lib一起连接

2、 动态链接库:

动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。

首先我们必须先注意到DLL内的函数分为两种:

1)外部函数,可供应用程序调用;

2)DLL内部函数,只能在DLL程序使用,应用程序无法调用它们。

因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。

‘贰’ 如何编译 opencv动态链接库

在一个项目中需要用到OpenCV,刚开始使用了OpenCV的动态链接库,这样,在移动可执行程序时还必须将OpenCV动态支持库一起搬移,很是麻烦。所以,最终选择OpenCV静态链接库,这样程序移植运行就方便了很多。

需要编译成静态库以便于应用程序链接。

网上有的教程中写的在VC++2010下安装OpenCV2.1时用到了TBB库,而我在编译链接自己的程序后需要用到TBB.dll。本人设计的目的就是要做一个独立的界面程序,不需要携带其他第三方库。经过一段时间的努力最终找到了编译OpenCV2.1静态库的方法。

‘叁’ c++ 关于动态链接库编译的问题

出现一个Executable For Debug Session对话框
---------------------------------------------
当你出现这个对话框时,是提示你应该选择一个.exe文件用来测试。
如果要设置的话:依次在主菜单中,工程-->设置-->debug下就可以看到这个对话框的设置了。

提示没有可执行文件来测试这个DLL文件。

因为,DLL文件自己是不能执行的,所以需要一个可执行文件(.exe)来加载它来测试。

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

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

‘伍’ 静态编译和动态编译有何不同

静态编译就是把库函数编译到你的程序里 这样编译的好处是 可以适应不同的平台 如果你是用window系统的话不建议用静态编译 因为这样会使你的代码量增大
动态编译就是不把库函数编译到你的程序里

‘陆’ 求教:aix下动态链接库*.so文件如何编译出来

先检查你的编译器是什么编译器:
看是gcc还是cc,下面是cc版本的
编译成32位版本:
cc -q32 -qmkshrobj -o XXXXXX.so XXXXXX.c
编译成64位版本:
cc -q64 -qmkshrobj -o XXXXXX.so XXXXXX.c

‘柒’ 怎样将自己做的动态链接库“静态”编译到可执行文件里

举例文件: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:.

‘捌’ 求助,依赖的动态库包含静态库,编译报错说找

动态链接库和静态链接库一般是编译集成一系列的接口(函数)
在程序源代码编译完成后通过编译器编译并通过链接器与这些库进行链接
动态链接库与静态链接库的区别在于链接器在进行链接时静态库会被直接编译进程序里
而动态链接库并不会,我们这里将这些链接库称作依赖(动态库和静态库)
程序的运行需要这些依赖,程序在静态链接后该程序本身便已包含该依赖
而动态链接后的程序本身本不包含该依赖,这些依赖需要执行者自行安装进操作系统(动态库、运行时库)
程序运行时会动态地加载这些库

linux上动态库一般的后缀后为.so
静态库一般的后缀为.a
由于静态链接会直接将库编译进程序里所以静态编译后的程序相较于动态链接所要大
这就是因为静态链接会将链接库编译进程序里的原因,所以占用就要大了
出于这种原因,静态库不易于维护与更新,如果链接库中有实现有bug等需要更新则需要更新整个程序,因为静态库被编译进程序中了
但动态库就没有这种情况了,因为动态库是程序运行时动态加载的,所以我们只需要更新动态库而不需要更新所有依赖该库的程序(软件)

另一方面,很多程序的开发都会使用到相同的链接库,也就是很多程序(软件)会有相同的依赖
如果将这些依赖全部静态编译的话将会造成存储资源占用过多而造成资源浪费
而使用动态库的方式这些程序(软件)则可以共享一个链接库,而不需要每个程序都带一个链接库,这样就大大地减少了存储资源占用空间

‘玖’ 制作DLL的源文件能不能编译成.SO文件

纯C写的话,移植到linux应该是很容易的

顺利的话直接在linux下编译就行了,不顺利的话,需要把windos下的函数替换成对应的linux下的,或者自己再封装一层

阅读全文

与只有动态链接库能编译吗相关的资料

热点内容
dvd光盘存储汉子算法 浏览:757
苹果邮件无法连接服务器地址 浏览:963
phpffmpeg转码 浏览:671
长沙好玩的解压项目 浏览:145
专属学情分析报告是什么app 浏览:564
php工程部署 浏览:833
android全屏透明 浏览:737
阿里云服务器已开通怎么办 浏览:803
光遇为什么登录时服务器已满 浏览:302
PDF分析 浏览:485
h3c光纤全工半全工设置命令 浏览:143
公司法pdf下载 浏览:382
linuxmarkdown 浏览:350
华为手机怎么多选文件夹 浏览:683
如何取消命令方块指令 浏览:349
风翼app为什么进不去了 浏览:778
im4java压缩图片 浏览:362
数据查询网站源码 浏览:150
伊克塞尔文档怎么进行加密 浏览:892
app转账是什么 浏览:163