• 关于

    动态链接库

    的搜索结果

回答

一.动态库的基本概念 动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序。动态链接库是目标文件的集合,目标文件在动态链接库中的组织方式是按照特殊方式形成的。库中函数和变量的地址是相对地址,不是绝对地址,其真实地址在调用动态库的程序加载时形成。 动态链接库的名称有别名(soname), 真名(realname)和链接名(linker name)。别名由一个前缀lib,然后是库的名字,再加上一个后缀“.so”构成。真名是动态链接库真实名称,一般总是在别名的基础加上一个小版本号,发布版本等构成。除此之外,还有一个链接名,即程序链接时使用的库的名字。 3.在动态链接库安装的时候,总是复制文件到某个目录下,然后用一个软连接生成别名,在库文件进行更新的时候,仅仅更新软链接即可。 二.生成和使用动态库1.看一个实例来了解如何自己生成静态库和使用静态库 创建程序文件 1>在test文件夹下有三个文件: main.c ,add.c,sub.c,tiger.h 2> main.c文件中的内容: #include<stdio.h> #include”tiger.h” int main(void) { printf(“sum =%d\n”,add(5,3)); printf(“sub= %d\n”,sub(5,3)); return 0; } 3>.tiger.h文件中的内容: #ifndef __TIGER__ #define __TIGER__ int add(int a,int b); int sub(int a,int b); #endif 4>.add.c文件中的内容 ? int add(int a, int b) { return a +b; } 5>.sub.c文件中的内容 int sub(int a, int b) { return a - b; } 动态库的生成 1>首先生成目标文件,但是此时要加编译器选项-fpic和链接器选项-shared, gcc -fpic -c add.c gcc -fpic -c sub.c 生成中间文件add.o和sub.o 2>其次生成动态库 gcc -shared –o libtiger.so add.o sub.o 生成动态库libtiger.so,libtiger.so就是我们生成的目标动态库。我们以后使用动态库和main.c程序生成可执行程序 说明: 以上两部也可以合成一步搞定: gcc -fpic -shared add.c sub.c -o libtiger.so 2.使用动态链接库 在编译程序时,使用动态链接库和静态库是一致的,使用”-l库名”的方式,在生成可执行文件的时候会链接库文件。 1>使用命令: gcc -o main main.c -L ./ -ltiger 2>-L指定动态链接库的路劲,-ldtiger链接库函数tiger。-ltiger是动态库的调用规则。Linux系统下的动态库命名方式是lib*.so,而在链接时表示位-l*,*是自己命名的库名。 3>但是程序会提示如下错误 error while loading shared libraries: libtiger.so: cannot open shared object file: No such file or direct 这是因为程序运行时没有找到动态链接库造成的。程序编译时链接动态库和运行时使用动态链接库的概念是不同的,在运行时,程序链接的动态链接库需要在系统目录下才行。 4>使用以下方法可以解决此问题 在linux下最方便的解决方案是拷贝libtiger.so到绝对目录 /lib 下(但是,要是超级用户才可以,因此要使用sudo哦,亲)。就可以生成可执行程序了 b.第二种方法是:将动态链接库的目录放到程序搜索路径中,可以将库的路径加到环境变量LD_LIBRARY_PATH中实现: export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH 执行此命令后也可以生成可执行程序

a123456678 2019-12-02 02:49:15 0 浏览量 回答数 0

回答

1.启动时,一般动态链接拥有更好的性能。因为,动态链接库可以不在启动时载入,或者已经被别的程序载入了,不需要再一次载入到内存。2.运行时,一般静态链接会拥有更好的性能。因为,动态链接库可能在运行时需要载入到内存,同时,对于编译成地址无关的动态链接库文件,执行时会多一步地址计算,性能会稍差一些。3.另外,如果内存不足时,因为静态链接的文件可能比动态连接不常用,更容易被swapout,那运行时性能,动态链接也可能优于静态链接。

a123456678 2019-12-02 02:37:21 0 浏览量 回答数 0

回答

1.启动时,一般动态链接拥有更好的性能。因为,动态链接库可以不在启动时载入,或者已经被别的程序载入了,不需要再一次载入到内存。2.运行时,一般静态链接会拥有更好的性能。因为,动态链接库可能在运行时需要载入到内存,同时,对于编译成地址无关的动态链接库文件,执行时会多一步地址计算,性能会稍差一些。3.另外,如果内存不足时,因为静态链接的文件可能比动态连接不常用,更容易被swapout,那运行时性能,动态链接也可能优于静态链接。

a123456678 2019-12-02 02:54:31 0 浏览量 回答数 0

阿里云爆款特惠专场,精选爆款产品低至0.95折!

爆款ECS云服务器8.1元/月起,云数据库低至1.5折,限时抢购!

回答

.h文件是动态链接库的头文件,这个可以不要,而且这个.h文件只适用于C/C++,其他的必须自己写.lib可以称之为"导入库"它的作用是在编译的时候提供一个链接的入口点,这个入口点在执行的时候会占到动态链接库的对应函数的入口.c/c++也可以不用.lib而直接使用LoadLibrary导入dll文件.而且.lib文件对于其他开发语言也一样完全没有作用,.dll是真正意义上的动态链接库,它自己独自可以完成所有动态链接库所需要做的事情。

a123456678 2019-12-02 01:59:40 0 浏览量 回答数 0

问题

linux下so动态链接库找不到函数符号问题

云栖技术 2019-12-01 19:43:51 2079 浏览量 回答数 1

问题

BIRT一个大缺陷,关于动态过滤和数据库连接?报错

爱吃鱼的程序员 2020-06-22 11:14:05 0 浏览量 回答数 1

问题

为什么我加载动态链接库失败了,路径绝对没有错错

a123456678 2019-12-01 20:28:44 1036 浏览量 回答数 1

回答

估计是libjpeg.so这个动态库不在系统默认的搜索路径中 ldd看下你的程序就知道了 我猜是notfound的情况 ldconfig-p|grepjpeg  估计也没有 可以将libjpeg.so放到默认的搜索路径中去回复 @Carlyle_Lee:搜索路径默认是/lib/usr/lib(/usr/lib64),/etc/ld.so.conf,还有环境变量LD_LIBRARY_PATH可以进行指定回复 @Carlyle_Lee:编译的时候,从动态库中拿到相应的符号(也就是导出的函数),并标记为动态加载,真正运行的时候再再进行动态加载,所以编译的时候要用到动态库,运行的时候也要用到,而使用静态库的时候,在编译连接的时候,静态库中的内容已经被全部包含进程序中了。推荐看看《程序员的自我修养-链接,装载与库》里面讲得很详细对的;这个库的确不在我的/usr/lib下,我是将所有的需要的文件都拷贝到当前目录下编译的;编译命令:g++-std=c++11*.o-otext-L.-ljpeg-lsqlite3疑问:我使用的-L.命令,即使这样我还是要吧libjpeg.so放到默认搜素路径下吗?不会搜素我的当前目录么?设置LD_LIBRARY_PATH环境变量,运行时加载动态库时通过这个环境变量的设置的目录去查找的这个取决你在编译的时候so的链接路径是直接写死的还是使用lib搜索路径的参数编译 1.加libjpeg.so的路径加入到/etc/ld.so.conf文件 2.执行ldconfig 3.执行ldconfig-p|greplibjpeg确认是否添加成功。 这个方法适合你本机开发调试。 如果是客户使用,直接使用yuminstalllibjpeg安装这个库,即可执行运行你程序了。使用makeinstall把libjpeg的动态库放到/usr/lib里面链接时需要指定用到的库,了解一下g++的-l参数。你试下在链接时加-ljpeg加的的,否则就不会编译通过。只是运行报错。问题应该在于链接静态库动态库的区别上。

爱吃鱼的程序员 2020-06-14 17:00:39 0 浏览量 回答数 0

问题

关于JNI多次加载同一个动态链接库

蛮大人123 2019-12-01 20:09:51 1450 浏览量 回答数 1

问题

关于JNI多次加载同一个动态链接库

a123456678 2019-12-01 19:51:06 698 浏览量 回答数 1

问题

linux动态链接库问题,郁闷了好久请高手帮忙……

a123456678 2019-12-01 19:53:23 876 浏览量 回答数 1

问题

无法定位程序输入点K32Get Module File Name Ex于动态链接库KERNEL32

1783518299684358 2019-12-01 19:11:03 101 浏览量 回答数 1

问题

linux动态库与静态库之间的调用问题

a123456678 2019-12-01 20:06:47 1097 浏览量 回答数 1

回答

如果一个程序运行了两个实例,很遗憾,这两个程序的代码并不会共享,因为程序代码在程序运行时就被装载到内存,第二个程序再启动时,系统没法判断也不会判断这个程序是否还是原来的程序(如果程序被更新或更改),所以仍然会把程序代码重新加载到内存的另一块区域。代码的共享体现应该是链接库中,特别是动态链接库中。因为库被设计成动态链接的,所以程序可以在运行后再确定代码所在的内存地址,这也就能实现多个程序调用同一块代码了。

a123456678 2019-12-02 02:59:06 0 浏览量 回答数 0

问题

C++编写的动态库,可不可以只有一个dll文件。

a123456678 2019-12-01 20:09:07 1052 浏览量 回答数 1

问题

物联网MQTT C-SDK能不能做成动态链接库?

剑出鞘 2019-12-01 19:28:10 896 浏览量 回答数 1

问题

linux动态库与静态库之间的调用问题

云栖技术 2019-12-01 19:41:28 1713 浏览量 回答数 1

问题

安装mysql-5.7.11-win32无法定位程序输入点TryAcquireSRWlockExclusive于动态链接库kernel32.dll

vipali 2019-12-01 19:44:13 46613 浏览量 回答数 3

回答

没看懂什么意思。 隔行如隔山啊。 ###### 缺少动态库 libgstinterfaces-0.10######链接上这个库还是同样的错误,请问是怎么回事儿?######请问这个库 库 libgstinterfaces-0.10怎么链接的呀?###### 请问这个库 库 libgstinterfaces-0.10怎么链接的呀?###### 楼主的问题解决了吗,求指教...

爱吃鱼的程序员 2020-06-04 17:49:52 0 浏览量 回答数 0

回答

1.只要你用到了a.h头文件里的内容那么就需要包含2.两个都需要-lmylib -la3.没法用了,因为动态库是在程序运行时被链接的4.用静态库是可以的,因为静态库被链接后库就直接嵌入可执行文件中了

a123456678 2019-12-02 02:01:49 0 浏览量 回答数 0

问题

已编译好的动态库中添加一个函数

杨冬芳 2019-12-01 20:20:23 729 浏览量 回答数 1

回答

(1)安装和下载Cygwin,下载 Android NDK (2)在ndk项目中JNI接口的设计 (3)使用C/C++实现本地方法 (4)JNI生成动态链接库.so文件 (5)将动态链接库复制到java工程,在java工程中调用,运行java工程即可

剑曼红尘 2020-04-10 12:51:28 0 浏览量 回答数 0

回答

你的这种情况是没有进行链接的。######回复 @zjwzcnjsy : 说的是windows下的静态库,非dll######回复 @bygreencn : ???。 A库引用B库,生成lib库A时,A中调用B库的函数,该函数的代码未被拷贝到A库中,这样的说法对吗?######标题相当的有问题,你要表达的是VC生成lib时如果同时需调用其他lib时并未链接其他lib。######那就是说标题的说法是没有什么问题的?######lib要看是动态库还是静态库,动态库可以理解成一份函数声明表,静态库则会包含函数实现######说的是windows下的静态库,非dll######说的是静态库######没用过vs编译器?######只有在A工程的属性->Librarian->Additional Dependencies中加入B.lib,生成的A.lib中才会包含B的内容。如果只是project dependencies中设置了依赖关系,A中不会包含B的内容,生成exe或dll的时候才会去真正做链接。

爱吃鱼的程序员 2020-06-05 13:18:17 0 浏览量 回答数 0

问题

求大神或管理员:安装mysql-5.7.11-win32无法定位程序输入点TryAcquireSRWlockExclusive于动态链接库kernel32.dll

西安诚骏 2019-12-01 20:12:29 6717 浏览量 回答数 1

问题

[c/c++]关于linux下动态库/静态库的基础问题

a123456678 2019-12-01 20:11:21 915 浏览量 回答数 1

回答

先说明,不管模板内部的实现调用了什么依赖库,模板生成的代码本身是静态链接的,因为模板的目标代码都是当时编译器即时生成的,所以前两个文件都是静态链接的,依赖的东西可能存在于libstdc++(libc++或者其它)当中,这一部分是动态链接的第三个文件大部分东西都是C里面的标准IO之类的东西,这些东西存在于libc当中,即是动态链接了。。

a123456678 2019-12-02 02:58:08 0 浏览量 回答数 0

回答

分开写好一点。编译的时候,分别编译每个cpp文件成为.o文件,最后链接每个.o文件,生成一个可执行的二进制文件这个二进制文件已经包含了需要接口的实现的二进制。所以不存在找到找不到。另,还有一个叫动态库的东东,在链接的时候不会放到可执行文件中去,那要怎么办呢?就要让这个可执行文件去找了!即在执行文件之前,要设置动态库的查找路径。比如在linux下就是配置LD_LIBRARY_PATH,通过这个路径找到其实现。

a123456678 2019-12-02 01:59:27 0 浏览量 回答数 0

问题

XCode 5 中如何在Command Line Tools项目中使用动态链接库dylib?

a123456678 2019-12-01 19:44:44 1212 浏览量 回答数 1

问题

在替换动态链接库时,浏览器崩溃。VC++开发的非MFC动态链接库。

a123456678 2019-12-01 20:26:52 1039 浏览量 回答数 1

回答

devel包含普通包,只比普通包多了头文件。动态链接库的话两种包都有。编译的时候如果需要用到这个库,那么需要安装这个库的devel,因为需要头文件

a123456678 2019-12-02 02:50:57 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站