www.js333comlinux下生成静态库和动态库

金沙澳门官网网址 1001.jpg

linux下生成静态库和动态库

思动博客

活佛兄镇楼。OO哈哈~

生龙活虎、动态库、静态库简单介绍

在表明Linux的.a、.so和.o文件涉及以前,先来看看windows下obj,lib,dll,exe的涉及

库是分享程序代码的法子,平时分为静态库(static libraries)、动态库(dynamically loaded libraries)和分享库(shared libraries)。

库是写好的并存的,成熟的,能够复用的代码。现实中种种程序都要依据超级多根底的底层库,不容许各类人的代码都从零开始,因此库的留存意义特别。本质上的话库是生机勃勃种可举办代码的二进制方式,能够被操作系统载入内部存储器实行。库有三种:

 

静态函数库实际上便是轻松的三个不足为奇的对象文件的集纳,平日的话习贯用“.a”作为文件的后缀。

静态库.a(win 系统下是libState of Qatar和动态库.so(win 系统下是.dll卡塔尔国。所谓静态、动态是指链接。回看一下,将二个程序编写翻译成可执路程序的步骤:

windows下obj,lib,dll,exe的关系

静态函数库,是在程序推行前就投入到指标程序中去了 。

金沙澳门官网网址 2

    lib是和dll对应的。lib是静态链接库的库文件,dll是动态链接库的库文件。 
    所谓静态就是link的时候把在那之中必要的东西收取出来布署到你的exe文件中,今后运维你的exe的时候不再要求lib。
    所谓动态正是exe运营的时候信任于dll里面提供的效劳,未有那个dll,你的exe不能够运营。 
    
    lib,dll,exe都算是最后的指标文件,是最后产品。而c/c++归于源代码。源代码和最后指标文件中连着的便是中等代码obj,实际上之所以供给中间代码,是你不容许贰次拿走目的文件。举例说二个exe必要广大的cpp文件生成。而编写翻译器叁次只可以编写翻译二个cpp文件。那样编写翻译器编写翻译好一个cpp现在会将其编写翻译成obj,当有着一定要的cpp都编写翻译成obj未来,再统意气风发link成所急需的exe,应该说缺乏任性三个obj都会引致exe的链接战败。
    
    1.obj里存的是编写翻译后的代码跟数据,况兼知名称,所以在再而三时一时会冒出未缓慢解决的表面符号的标题。当连成exe后便子虚乌有名称的概念了,仅有地址。lib便是一批obj的结合。
    2.理论上得以连接obj文件来援引其余工程(能够以为多少个obj文件等价于编写翻译生成它的cpp文件,能够引用obj来替换cpp,也能够增多cpp来替换obj 卡塔尔国,但实则中平时用lib来兑现工程间相互影响引用。
    3.编写翻译器会暗中同意链接一些常用的库,此外的须要你协和钦命。
    
lib和DLL的区别

静态库的后缀是.a,它的产面生两步

静态库在程序编译时会被连接到目标代码中,程序运维时将不再须求该静态库。

    (1卡塔尔(قطر‎lib是编写翻译时索要的,dll是运作时需求的。借使要完李冠希代码的编写翻译,有lib就够了。如果也使动态连接的程序运维起来,有dll就够了。在支付和调养阶段,当然最佳都有。
    (2State of Qatar平日的动态库程序有lib文件和dll文件。lib文件是必得在编写翻译期就连接受应用程序中的,而dll文件是运作期才会被调用的。假如有dll文件,那么相应的lib文件平日是一些索引新闻,具体的实以往dll文件中。假若独有lib文件,那么那个lib文件是静态编写翻译出来的,索引和兑现都在当中。 静态编写翻译的lib文件有益处:给顾客安装时就无需再挂动态库了。但也可能有劣点,正是引致应用程序超级大,并且失去了动态库的布帆无恙,在本子晋级时,同临时间要发布新的应用程序才行。
    (3State of Qatar在动态库的气象下,有几个文本,多个是引进库(.LIB)文件(实际上也好不轻松叁个静态库,只是在链接时只可以把函数在DLL的入口链接到exe中,而不像真的静态链接库那样将函数体真正链接到exe中 ,通过lib进行的动态链接实际上也接受了静态链接来兑现 State of Qatar,二个是DLL文件,引进库文件满含被DLL导出的函数的称谓和岗位,DLL满含实际的函数和数量,应用程序使用LIB文件链接到所急需采纳的DLL文件,库中的函数和数码并不复制到可执行文件中,因而在应用程序的可推行文件中,贮存的不是被调用的函数代码,而是DLL中所要调用的函数的内部存款和储蓄器地址,那样当三个或三个应用程序运维是再把程序代码和被调用的函数代码链接起来,进而节省了内部存款和储蓄器财富。从地点的认证能够见到,DLL和.LIB文件必需随应用程序一同发行,不然应用程序将会发生错误。

金沙澳门官网网址 3

DLL内的函数分为二种: 
    (1卡塔尔DLL导出函数,可供应用程序调用;
    (2卡塔尔(قطر‎DLL内部函数,只好在DLL程序行使,应用程序不可能调用它们

Android中需要设定Android.mk文件。

金沙澳门官网网址 4

创立静态链接库和成立动态链接库

动态库是在当三个可执路程序在运维的时候被加载。

静态库特点总计:

    VC6中创建[Win32 Dynamic-Link Library]工程便得以成立出三个空的DLL工程.

在linux上叫分享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll。

-静态库对函数库的链接是坐落于编写翻译年代实现的。

    VC6中创建[Win32 Static Library]工程便得以成立出四个空的LIB工程(静态链接库工程,仅生成叁个lib文件卡塔尔国.

各种动态库都有个优越的名字,称作“soname”。soname名字命名必需以“lib”作为前缀,然后是函数库的名字,然后是“.so”,最终是本子号音信。

-程序在运作时与函数库再非亲非故系,移植方便。

加多lib文件的常用办法有二个: 
    1、把*.lib放在VC的Lib目录中 
    2、修正project setting的Link->Input中的Addtional library path,出席你的目录dll:是可实际上运作的二进制代码,有一定代码的!

动态库库文件必得放在一些特定的目录里,这样经过系统的情况变量设置,应用程序技艺准确的利用那些函数库。

-浪费空间和财富,因为有着相关的靶子文件与牵涉到的函数库被链接合成一个可实践文件。

    3、也能够在object/library中央直属机关接写上lib文件路径.(这里实乃足以写上任性obj文件恐怕lib文件的State of Qatar.

代码装载速度快,实行进程略比动态链接库快; 只需保障在开拓者的电脑中有科学的.LIB文件,在以二进制方式发布程序时不需思考在顾客的微电脑上.LIB文件是或不是留存及版本难题,可幸免so地狱等主题素材。

-是静态库对前后相继的立异、安顿和揭发页会带来麻烦。即便静态库liba.lib更新了,所以使用它的应用程序都供给再一次编写翻译、公布给客商(对于游戏用户来讲,大概是二个超小的更改,却促成整个程序重新下载,全量更新)。

 

越是节本省部存款和储蓄器并压缩页面沟通; so文件与EXE文件独立,只要输出接口不变(即名称、参数、重回值类型和调用约定不改变),改换so文件不会对EXE文件变成任何影响,由此不小地进步了可维护性和可增添性; 分歧编制程序语言编写的主次风度翩翩旦信守函数调用约定就足以调用同多个so函数;适用于平淡无奇的软件开拓,使开采进度独立、耦合度小,便于区别开拓者和开辟公司之间进行支付和测验。

动态库在前后相继编写翻译时并不会被接连到对象代码中,而是在程序运转是才被载入,因而在程序运转时还亟需动态仓库储存在。

 

运用静态链接生成的可履行文件体积相当的大,富含相符的公家代码,产生浪费; 使用动态链接库的应用程序不是自完善的,它依附的so模块也要留存,如若运用载入时动态链接,程序运营时开采DLL子虚乌有,系统将下不为例程序并提交错误消息。而接纳运营时动态链接,系统不会截至,但出于so中的导出函数不可用,程序会加载战败;速度比静态链接慢。当有个别模块更新后,如若新模块与旧的模块不相配,那么这一个必要该模块工夫运作的软件,统统撕掉。

金沙澳门官网网址 5

 

静态库使用静态链接的主意。

动态库特点计算:

linux .o,.a,.so

        .o,是指标文件,约等于windows中的.obj文件 

  .so 为分享库,是shared object,用于动态连接的,也正是windows下的dll 

  .a为静态库,是不菲个.o合在合作,用于静态连接 

 

静态函数库
性格:实际上是简约的常备指标文件的会面,在程序奉行前就参预到目的程序中。
优点:能够用在此以前有些程序包容;描述轻易;允许程序猿把程序link起来而不用重新编译代码,节省了双重编写翻译代码的年华(该优势近年来已不鲜明);开拓者能够对源代码保密;理论上选择ELF格式的静态库函数生成的代码能够比使用分享或动态函数库的程序运维速度快(大约1%-5%)
生成:使用ar程序(archiver的缩写)。ar rcs my_lib.a f1.o f2.o是把目的代码f1.o和f2.o加入到my_lib.a这些函数库文件中(倘使my_lib.a不设有则创建)
使用:用gcc生成可实行代码时,使用-l参数内定要参与的库函数。也得以用ld命令的-l和-L参数。
 
分享函数库
    分享函数库在可执路程序运维的时候加载,全部程序重国民党的新生活运动行时都可自动加载分享函数库中的函数。.so文件感觉很复杂,光是命名准绳就早就看得自身很晕了~收拾一下,分享库必要:soname、real name,此外编写翻译的时候名字也有说法。依次解释下:
soname:必需的格式:lib+函数库名+.so+版本号新闻(不过切记,极度底层的C库函数都不是以lib早先命名的)。例子:/usr/lib/libreadline.so.3
real name:看名就能够猜到其意义是的确的名字呀,有主版本号和批发版本号。可是没找到实例……
编写翻译器编写翻译的时候须求的函数库的名字就是不带有版本号消息的soname,比方地方的例证把最后的.3去掉就能够了。
地方:共享函数库文件必得放在特定目录,对于开放源码来讲,GNU规范建议具有的函数库文件都放在/usr/local/lib目录下,并且建议命令、可执路程序都放在/usr/local/bin目录下。可是那几个只是习于旧贯啦,能够改造,具体的岗位音讯能够看/etc/ld.so.conf里面包车型客车安插消息。当然,也能够纠正这些文件,参与本人的有的独特的门路供给。
创办:在英特网找到了gcc格局和easyeclipse景况下三种成立形式。
gcc方式:
    首先成立object文件,那一个文件将加盟通过gcc –fPIC 参数命令到场到分享函数Curry面,规范格式:gcc -shared -Wl,-soname,your_soname -o library_name file_list library_list(说真的这一个专门的学业格式看起来好复杂,小编找了个实例,可是好像和非常规范格式稍有例外:gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so)
在easyeclipse意况下生成.so文件:
        1.精选新建筑工程程,创设三个c++工程
        2.在工程项目采用里甄选 Shared Library,然后填入工程名字PXXX点击完结就能够。
        3.编写程序,然后编写翻译就能够在debug也许release里生成一个libPXXX.so文件,假诺不要lib的开首标志点击project菜单的Properties选项,然后在弹出的分界面包车型大巴左边点击Build artifact页面,将Output prefix选项的原委清空就能够。
        4.假诺是C++程序,注目的在于接口函数的前头加上extern "C"标记,在头文件加上如下标识:
#ifdef   __cplusplus  
#extern   "C"{  
#endif  
   
头文件中央  
   
#ifdef   __cplusplus  
}  
#endif  
     假使不加以上标志,经过编写翻译后,so里的函数名并不是你编写程序时设定的函数名,在支付条件左边的工程文件列表中式茶食开debug项里的PXXX.o能够看出so文件里的函数名都以在你设定的函数名背后加了叁个__Fi标志,比如您用的设定的函数名称是Func(卡塔尔, 而so里的函数名则为Func__Fi(State of Qatar大概别的的名号。
安装:拷贝共享库文件到钦赐的正经的目录,然后运行ldconfig。若无权力那样做,那么就只可以通过更改情况变量来兑现那些函数库的接受了。方法不再说了,很复杂。
查阅:能够经过运转ldd来看有些程序行使的共享函数库。比方ldd /bin/ls。查看.so文件使用nm命令,如nm libXXX.so。(注意,nm对于静态的函数库和分享的函数库都起功效)
至于覆盖:如若想用本人的函数覆盖有些库中的一些函数,同一时候保留该库中任何的函数的话,能够在/etc/ld.so.preload中投入要替换的库(.o结尾的文件),那个preloading的库函数将有优先加载的义务。
关于立异:每一回新扩充动态加载的函数库、删除有个别函数库可能涂改有些函数库的路径时,都要重复运维ldconfig来更新缓存文件/etc/ld.so.cache,此文件保留已排好序的动态链接库名字列表

(在Linux下,分享库的加载是由/lib/ld.so达成的,ld.so加载分享库时,会从ld.so.cache查找卡塔尔国

 

 

 

 

我们平常把一些公用函数制作成函数库,供别的程序接纳。函数库分为静态库和动态库两
种。静态库在程序编写翻译时会被连接到指标代码中,程序运营时将不再必要该静态库。动态
库在先后编写翻译时并不会被连接到对象代码中,而是在程序运转是才被载入,因而在前后相继运
行时还要求动态仓库储存在。本文主要透过譬世尊注解在Linux中什么创制静态库和动态库,以
及应用它们。

在开创函数库前,我们先来准备举个例子用的源程序,并将函数库的源程序编写翻译成.o文件。

第1步:编辑获得举个例子的顺序--hello.h、hello.c和main.c;

hello.c(见程序2卡塔尔是函数库的源程序,个中含有公用函数hello,该函数就要显示器上输出"
Hello XXX!"。hello.h(见程序1卡塔尔(قطر‎为该函数库的头文件。main.c(见程序3卡塔尔为测量试验库文件的
主程序,在主程序中调用了公用函数hello。

程序1: hello.h

#ifndef HELLO_H
#define HELLO_H

void hello(const char *name);

#endif //HELLO_H

程序2: hello.c

#include <stdio.h>

void hello(const char *name)
{
printf("Hello %s!\n", name);
}

程序3: main.c

#include "hello.h"

int main()
{
hello("everyone");
return 0;
}

第2步:将hello.c编译成.o文件;

无论静态库,依旧动态库,都以由.o文件成立的。因而,我们必得将源程序hello.c通过g
cc先编写翻译成.o文件。

在系统提醒符下键入以下命令得到hello.o文件。

# gcc -c hello.c

#

咱俩运转ls命令看看是或不是生存了hello.o文件。

# ls

hello.c hello.h hello.o main.c

#

在ls命令结果中,大家看见了hello.o文件,本步操作实现。

上面我们先来拜访哪些创建静态库,以致选用它。

第3步:由.o文件创制静态库;

静态库文件名的命名标准是以lib为前缀,紧接着跟静态库名,扩展名叫.a。比方:我们将
始建的静态库名叫myhello,则静态库文件名正是libmyhello.a。在创制和行使静态库时,
亟待小心那点。创设静态库用ar命令。

在系统提醒符下键入以下命令将成立静态库文件libmyhello.a。

# ar -cr libmyhello.a hello.o

#

大家相同运转ls命令查看结果:

# ls

hello.c hello.h hello.o libmyhello.a main.c

#

ls命令结果中有libmyhello.a。

第4步:在前后相继中选择静态库;

静态库制作完了,如何利用它在那之中的函数呢?只需求在使用到这几个公用函数的源程序中包
含这几个公用函数的原型证明,然后在用gcc命令生成目的文件时指明静态库名,gcc将会从
静态库大校公用函数连接到对象文件中。注意,gcc会在静态库名前加上前缀lib,然后追
加增添名.a获得的静态库文件名来搜寻静态库文件。

在前后相继3:main.c中,我们包括了静态库的头文件hello.h,然后在主程序main中央市直机关接调用公
用函数hello。上边先生成目的程序hello,然后运行hello程序看看结果怎样。

法一 # gcc -o hello main.c -L. –lmyhello,或gcc  main.c -L. –lmyhello -o hello自定义的库时,main.c还可放在-L.和 –lmyhello之间,可是无法放在它俩之后,不然会提示myhello没定义,可是是系统的库时,如g++ -o main(-L/usr/lib) -lpthread main.cpp就不出错。

法二 #gcc main.c libmyhello.a -o hello或gcc  -o hello main.c libmyhello.a

法三:先生成main.o:gcc -c main.c ,再生成可施行文件:gcc -o hello main.o libmyhello.a或gccmain.o libmyhello.a -o hello ,动态库连接时也足以如此做。

# ./hello

Hello everyone!

#

大家删除静态库文件试试公用函数hello是不是确实连接到对象文件 hello中了。

# rm libmyhello.a

rm: remove regular file `libmyhello.a'? y

# ./hello

Hello everyone!

#

次第照常运作,静态库中的公用函数已经两次三番到对象文件中了。

咱俩后续看看怎么着在Linux中创立动态库。大家依旧从.o文件开始。

第5步:由.o文件创造动态库文件;

动态库文件名命名标准和静态库文件名命名标准相同,也是在动态库名扩大前缀lib,但其
文件扩大名称为.so。举例:大家将创造的动态库名称叫myhello,则动态库文件名就是libmyh
ello.so。用gcc来创立动态库。

在系统提醒符下键入以下命令获得动态库文件libmyhello.so。

# gcc -shared -fPIC -o libmyhello.so hello.o (-o不可少)

#

我们照例使用ls命令看看动态库文件是或不是变动。

# ls

hello.c hello.h hello.o libmyhello.so main.c

#

第6步:在程序中使用动态库;

在前后相继中央银行使动态库和动用静态库完全大器晚成致,也是在接收到那个公用函数的源程序中带有
那个公用函数的原型评释,然后在用gcc命令生成指标文件时指明动态库名进行编写翻译。大家
先运维gcc命令生成指标文件,再运转它看看结果。

# gcc -o hello main.c -L. -lmyhello

(或 #gcc main.c libmyhello.so -o hello 不会出错(未有libmyhello.so的话,会出错),不过接到来./hello 会提醒出错,因为就算接二连三时用的是当前目录的动态库,可是运转时,是到/usr/lib中找库文件的,将文件libmyhello.so复制到目录/usr/lib中就OK了卡塔尔

# ./hello

./hello: error while loading shared libraries: libmyhello.so: cannot open shar
ed object file: No such file or directory

#

啊!出错了。快看看错误提醒,原本是找不到动态库文件libmyhello.so。程序在运作时,
会在/usr/lib和/lib等目录中搜索需求的动态库文件。若找到,则载入动态库,不然将提
示肖似上述荒诞而终止程序运转。大家将文件libmyhello.so复制到目录/usr/lib中,再试
试。

# mv libmyhello.so /usr/lib

# ./hello

Hello everyone!

#

成功了。那也更是证实了动态库在程序运转时是索要的。

咱俩向后看看,开采使用静态库和平运动用动态库编写翻译成指标程序使用的gcc命令完全平等,
那当静态库和动态库同名时,gcc命令会使用哪个库文件呢?抱着对题目必究到底的心理,
来试试看看。

先删除除.c和.h外的享有文件,恢复生机成咱们刚刚编辑完举例程序状态。

# rm -f hello hello.o /usr/lib/libmyhello.so

# ls

hello.c hello.h main.c

#

在来成立静态库文件libmyhello.a和动态库文件libmyhello.so。

在变化无穷动态库时,须要采用-fPIC,那样工夫生成职分非亲非故的代码,达到代码段和数据段分享的目标

# gcc -c -fpic hello.c  //编译hello.c时也急需增多-fpic选项,不然rodata' can not be used when making a shared object; recompile with -fPIC

# ar -cr libmyhello.a hello.o (或-cvr )

# gcc -shared -fPIC -o libmyhello.so hello.o

# ls

hello.c hello.h hello.o libmyhello.a libmyhello.so main.c

#

经过上述最终一条ls命令,能够开采静态库文件libmyhello.a和动态库文件libmyhello.s
o都已经变化,并都在当前目录中。然后,大家运行gcc命令来行使函数库myhello生成靶子
文本hello,并运转程序 hello。

# gcc -o hello main.c -L. –lmyhello (动态库和静态库同期设临时,优先使用动态库, 当然,直接#www.js333com,gcc main.c libmyhello.a -o hello的话,正是点名字为静态库了)

# ./hello

./hello: error while loading shared libraries: libmyhello.so: cannot open shar
ed object file: No such file or directory

#

从程序hello运营的结果中非常轻巧理解,当静态库和动态库同名时,gcc命令将事情未发生前利用动态库,暗中认可去连/usr/lib和/lib等目录中的动态库,将文件libmyhello.so复制到目录/usr/lib中就能够。

Note:
编写翻译参数拆解分析
最根本的是GCC命令行的二个增选:
-shared 该接受钦点生成动态连接库(让连接器生成T类型的导出符号表,临时候也生成弱连接W类型的导出符号),不用该标记外界程序不大概连接。也正是叁个可实施文件

-fPIC 成效于编写翻译阶段,告诉编写翻译器产生与岗位非亲非故代码(Position-Independent Code卡塔尔(قطر‎。那么在发出的代码中,没有断然地址,全体应用相对地址,故而代码能够被加载器加载到内部存款和储蓄器的妄动地点,都得以准确的履行。那多亏共享库所必要的,分享库被加载时,在内部存款和储蓄器的职位不是固定的。

假如不加fPIC,则编写翻译出来的代码在加载时须要依赖加载到的职责展开重平昔(因为它当中的代码并非岗位非亲非故代码卡塔尔国,如果被几个应用程序合作使用,那么它们必得各个程序维护意气风发份so的代码别本了.(因为so被每一个程序加载的职责都不及,显明那一个重定位后的代码也比不上,当然无法分享State of Qatar。

永不此选项的话编写翻译后的代码是岗位相关的,所以动态载入时是透过代码拷贝的不二等秘书籍来满意区别进度的急需,而不可能实现确实代码段分享的指标。

-L. 代表要连接的库在当前目录中;(四个库:在编写翻译命令行中,将运用的静态库文件放在源文件前面就能够了。比方:gcc -L/usr/lib myprop.c libtest.a libX11.a libpthread.a -o myprop
在那之中-L/usr/lib钦命库文件的搜求路线。编写翻译器暗许在当前目录下先找找钦点的库文件,如前方的“法二 #gccmain.c libmyhello.a-o hello”)

-lmyhello 编写翻译器查找动态连接库时有隐含的命名法规,即在交付的名字前边加上lib,后边加上.so或.a来分明库的名称libmyhello.so或libmyhello.a。
LD_LIBRARY_PATH那个遭受变量提醒动态连接器能够装载动态库的渠道。
当然假使有root权限的话,能够修正/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同等的目标,可是假设未有root权限,那么只好接受输出LD_LIBRARY_PATH的主意了。

调用动态库的时候有多少个难题会一时碰着,有的时候,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数教导,并钦点了“-l”的库名,但经过ldd命令察看时,正是坚定找不到您内定链接的so文件,这时候你要作的正是经过退换LD_LIBRARY_PATH大概/etc/ld.so.conf文件来钦命动态库的目录。日常这样做就足以消除库不能链接的难题了。

 

 

 

静态库链接时寻觅路线顺序:

  1. ld(GNU linker卡塔尔国会去找GCC命令中的参数-L

   编写翻译进度是分为八个品级:预管理(也称预编写翻译,Preprocessing卡塔尔国、编写翻译(Compilation卡塔尔(قطر‎、汇编 (Assembly卡塔尔和连接(link卡塔尔国 【链接】

  1. 再找gcc的条件变量LIBRA途睿欧Y_PATH
  2. 再找钦赐目录 /lib /usr/lib /usr/local/lib 那是那时候compile gcc时写在前后相继内的

金沙澳门官网网址,动态链接时、推行时搜索路线顺序:

  1. 编写翻译指标代码时钦命的动态库找寻路线
  2. 条件变量LD_LIBRARY_PATH钦定的动态库找寻路线
  3. 铺排文件/etc/ld.so.conf中钦定的动态库寻找路线
  4. 暗中同意的动态库寻找路线/lib
  5. 暗中认可的动态库寻觅路线/usr/lib

有关情形变量:
LIBRARY_PATH意况变量:钦点程序静态链接库文件寻觅路线
LD_LIBRARY_PATH情形变量:钦命程序动态链接库文件找寻路线

 

另:

从上述可以看到,怎么着找到变化的动态库有3种方法:

(1卡塔尔国把库拷贝到/usr/lib和/lib目录下。

(2)在LD_LIBRARY_PATH情状变量中丰硕库所在路径。

譬喻说动态库libhello.so在/home/example/lib目录下:

export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/home/example/lib

(3卡塔尔国改革/etc/ld.so.conf文件,把库所在的渠道加到文件末尾(直接写在文书末尾,不要在路线前加include卡塔尔(قطر‎,并奉行ldconfig刷新(ldconfig 命令的用项,首若是在默许搜寻目录(/lib和/usr/lib卡塔尔以致动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可分享的动态链接库(格式如前介绍,lib*.so*State of Qatar,进而创建出动态装入程序(ld.so卡塔尔所需的连续几天和缓存文件.缓存文件默许为/etc/ld.so.cache,此文件保留已排好序的动态链接库名字列表.)。那样,插足的目录下的享有库文件都可知。

附:像下面那样钦点路径去老是系统的静态库,会报错说要一而再的库找不到:

g++ -o main main.cpp -L/usr/lib libpthread.a 

总得那样g++ -o main main.cpp -L/usr/lib -lpthread才正确 。

自定义的库考到/usr/lib 下时,

g++ -o main main.cpp -L/usr/lib libpthread.a libthread.a libclass.a会出错,然则如此g++ -o main main.cpp -L/usr/lib -lpthread -lthread -lclass就不易了。

 

转自  

动态库也得以利用静态链接。

-动态库把对一些库函数的链接载入推迟到程序运营的一代。

动态库使用静态链接的时候,载入代码就能把程序会用到的动态代码或动态代码的地址鲜明下来。

-能够落成进程之间的财富分享。(由此动态库也叫做分享库)

动态链接方法,唯有动态库使用。

-将某个顺序进级变得轻易。

采纳这种方法的顺序并不在大器晚成开头就水到渠成动态链接,而是直到真正调用动态库代码时,载入程序才总计动态代码的逻辑地址,然后等到有些时候,程序又须求调用别的某块动态代码时,载入程序又去总结那有个别代码的逻辑地址,所以,这种措施使程序早先化时间相当的短,但运转时期的质量不比静态链接的次序。

-以至能够真正形成链接载入完全由工程师在程序代码中决定(来得调用)。