首页运维零件 › 首先我们通过三个文件生成一个对应的so库,GCC是Linux下主要的程序生成工具

首先我们通过三个文件生成一个对应的so库,GCC是Linux下主要的程序生成工具

非了老半天武功,终于把功底打好了,猴急的你曾经按耐不住刺激的想初叶尝试了呢!哈哈。。。OK,说整咱就开整,接下去自个儿就教导大家一步一步来开荒和睦的动态库,然后教大家怎么去行使它。

OK,有了那一个文化,接下去大家就足以弄精晓本人所做的政工是干什么了。都在说例子是最佳大校,大家就从例子动手。
1、静态链接库
咱俩先构建自身的静态链接库,然后再利用它。制作静态链接库的进度中要用到gcc和ar命令。
未雨打算粮草先行八个库的源码文件st1.c和st2.c,用它们来创设库libmytest.a,如下:

1.6 怎样知道三个可执路程序信任哪些库

ldd命令可以查看一个可执路程序信赖的分享库,

例如:

ldd /bin/lnlibc.so.6

=> /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2 
=> /lib/ld- linux.so.2 (0×40000000) 

能够观察ln命令信任于libc库和ld-linux库。

NOTE

****编译参数剖判
**
最注重的是GCC命令行的三个取舍:-shared
该选用钦定生成动态连接库(让连接器生成T类型的导出符号表,不常候也生成弱连接W类型的导出符号),不用该标记外界程序一点都不大概连接。相当于三个可推行文件

  • -fPIC:表示编写翻译为地点独立的代码,不用此选项的话编写翻译后的代码是岗位相关的之所以动态载入时是经过代码拷贝的主意来满意不相同进度的内需,而不可能达标真正代码段分享的指标。
  • -L.:表示要一而再的库在当前目录中
  • -ltest:编写翻译器查找动态连接库时有隐含的命名法则,即在付给的名字前边加上lib,后边加上.so来明确库的名称l
    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文件来钦定动态库的目录。常常那样做就足以解决库不可能链接的难点了。
    静态库链接时寻找路线顺序:
  • ld会去找GCC命令中的参数-L2. 再找gcc的条件变量LIBRAOdysseyY_PATH3.
    再找钦定目录 /lib /usr/lib /usr/local/lib 这是那个时候compile
    gcc时写在前后相继内的
    动态链接时、实施时搜索路线顺序:
  • 编写翻译目的代码时钦定的动态库寻找路线;
  • 条件变量LD_LIBRARY_PATH钦点的动态库搜索路线;
  1. 布置文件/etc/ld.so.conf中钦定的动态库找寻路线;
  2. 暗中同意的动态库寻找路线/lib;
  3. 私下认可的动态库寻找路径/usr/lib。
    关于蒙受变量:
    LIBRARY_PATH景况变量:钦赐程序静态链接库文件搜索路线LD_LIBRARY_PATH情形变量:钦赐程序动态链接库文件寻觅路线

1.可执行文件(应用程序)

接纳“-ltest”标识来报告GCC驱动程序在连年阶段引用分享函数库libtest.so。“-L.”标志告诉GCC函数库可能坐落于当前目录。不然GNU连接器会招来规范种类函数目录。
此地大家注意,ldd的输出它说大家的libtest.so它没找到。还记得本身在前边动态链接库风姿罗曼蒂克节刚起头时的那堆唠叨么,未来您应有很明亮了怎么了吗。因为大家的libtest.so既不在/etc/ld.so.cache里,又不在/lib、/usr/lib或/etc/ld.so.conf所钦命的其它七个索引中。怎么办?还用我告诉你?管你用什么办法,反正笔者用的ldconfig
`pwd`搞定的:
施行结果如下:

2.8 有关口边情形变量

LIBRARY_PATH处境变量:钦命程序静态链接库文件寻觅路线

LD_LIBRARY_PATH情形变量:钦点程序动态链接库文件寻觅路线

 

转自:

变化静态库

变动对应的四个.o文件
<code>gcc -c test_a.c test_b.c test_c.c </code>
生成libtest.a静态库
<code>ar rcs libtest.a test_a.o test_b.o
test_c.o</code>
运用静态库
<code>gcc -o test test.c -static -L. -ltest</code>
接下来运转和查阅程序
<code>crystal@crystal:~/workspace/sotest$ ./test
this is in test_a..
this is in test_b..
this is in test_c..
crystal@crystal:~/workspace/sotest$ ldd test
不是动态可实施文件</code>
此刻黄金年代经去除libtest.a文件程序也是能够健康运作的,並且test可执路程序会比此外动态可执行文件大过多。

方法一:

 

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

ld会去找GCC命令中的参数-L

再找gcc的蒙受变量LIBRA奥迪Q5Y_PATH

再找内定目录/lib  /usr/lib
 /usr/local/lib  那是那时Compile gcc时写在前后相继内的。

浮动动态库

编制程序八个文本生成so库,在那之中-shared指生成动态库,-fPIC指生成的库地址非亲非故。
<code>gcc test_a.c test_b.c test_c.c -fPIC -shared -o
libtest.so</code>
应用动态库
<code>gcc -o test test.c -L. -ltest</code>
可是那个时候风华正茂旦选拔ldd恐怕运维test程序的话,就能发掘前后相继依然运转不了。
<code>crystal@crystal:~/workspace/sotest$ ldd test
linux-vdso.so.1 => (0x00007ffea3b8a000)
libtest.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f095aa14000)
/lib64/ld-linux-x86-64.so.2 (0x00005564bf151000)</code>
那个因为大家个人的so库,并不可能被系统平昔识别,须求实行LD_LIBRARY_PATH 或然在/etc/ld.so.conf.d目录下边增多对应的库项。
执行<code>export
LD_LIBRARY_PATH=$(pwd)
</code>然后重国民党的新生活运动路程序。可是每一回都如此会来得很麻烦,那是大家能够把我们放置so的目录加多到/etc/ld.so.conf.d/目录上面去,然后实行ldconfig命令
<code>
crystal@crystal:~/workspace/sotest$ sudo vim
/etc/ld.so.conf.d/test.conf
crystal@crystal:~/workspace/sotest$ cat
/etc/ld.so.conf.d/test.conf
/home/crystal/workspace/sotest
crystal@crystal:~/workspace/sotest$ sudo ldconfig
crystal@crystal:~/workspace/sotest$ ./test
this is in test_a..
this is in test_b..
this is in test_c..</code>

图片 1

 

2.7 动态库链接时,实施时追寻路径顺序:

编写翻译指标代码时钦赐的动态库找出路线;

遇到变量LD_LIBRARY_PATH钦赐的动态库寻找路线;

陈设文件/etc/ld.so.conf中钦定的动态库搜索路线;

暗许的动态库寻找路线 /lib;

暗许的动态库搜索路线/usr/lib。

首先大家经过四个公文生成五个对应的so库,然后演示如何调用对应的库。生成对应的三个文本,test_a.c,test_b,c,test_c.c,so_test.h,test.c。
<code>
so_test.h
#include "stdio.h"
void test_a();
void test_b();
void test_c();
</code>
<code>
test_a.c
#include "so_test.h"
void test_a()
{
printf("this is in test_a..\n");
}
</code>
<code>
test_b.c
#include "so_test.h"
void test_b()
{
printf("this is in test_b..\n");
}
</code>
<code>
test_c.c
#include "so_test.h"
void test_c()
{
printf("this is in test_c..\n");
}
</code>
<code>
test.c
#include "so_test.h"

静态库文件libmytest.a已经成形,用file命令查看其性质,开采它实乃归档压缩文件。用ar
-t libmytest.a可以查看一个静态库包涵了那个obj文件:

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf
 动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名

2.1 计划好测验代码

hello.h(见程序1)为该函数库的头文件。

hello.c(见程序2)是函数库的源程序,在那之中积攒公用函数hello,该函数就要荧屏上输出"Hello
XXX!"。

main.c(见程序3)为测验库文件的主程序,在主程序中调用了公用函数hello。

多个程序都献身文件夹~/testso中

程序1:hello.h

#ifndef HELLO_H 
#define HELLO_H 
    void hello(const char *name); 
#endif

程序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; 
 }

int main()
{
test_a();
test_b();
test_c();
return 0;
}
</code>

当要利用静态的程序库时,连接器会找寻程序所需的函数,然后将它们拷贝到推行文书,由于这种拷贝是风华正茂体化的,所以风流倜傥旦三番两遍成功,静态程序库也就不再供给了。然则,对动态库来讲,就不是那样。动态库会在试行顺序内留下二个标志指明当程序实施时,首先必得载入那一个库。由于动态库节省空间,linux下展开延续的缺省操作是率先连接动态库,相当于说,要是相同的时候设有静态和动态库,不特意钦定的话,将与动态库相连接。

 

2.2 难题的建议

注意:这时,我们编写翻译好的hello.o是回天乏术透过gcc
-o编译的(生成可执路程序),这些道理很简单,hello.c是三个不曾main函数的.c程序,因而不结合二个完好的次序,借使使用gcc
-o编写翻译并三番五次它,GCC将报错。

不论是静态库,依旧动态库,都以由.o文件创设的。因而,我们必得将源程序hello.c通过gcc先编译成.o文件。

那时候,我们有二种思路:

1)通过编写翻译八个源文件,直接将对象代码合成叁个.o文件。

2)通过创建静态链接库libmyhello.a,使得main函数调用hello函数时可调用静态链接库。

3)通过创立动态链接库libmyhello.so,使得main函数调用hello函数时可调用静态链接库。

-shared该采用钦定生成动态连接库(让连接器生成T类型的导出符号表,不经常候也生成弱连接W类型的导出符号),不用该标记外界程序无法连接。相当于二个可实行文件。

然后/etc/ld.so.conf.d/目录下存放了累累*.conf文件,如下:

1.7 可施行程序在实践的时候怎么牢固分享库文件

当系统加载可推行代码时候,可以领略其所依据的库的名字,但是还亟需明白相对路线。

那时候,就须要系统动态载入器(dynamic
linker/loader)

对于elf格式的可履行程序,是由ld-linux.so*来成功的,它前后相继搜索elf文件的DT_PRATH段——意况变量LD_LIBRARY_PATH——/etc/ld.so.cache缓存文件列表——/lib/、/usr/lib目录,找到库文件后将其载入内部存款和储蓄器。如:

export LD_LIBRARY_PATH='pwd'

将近来文件目录增加为分享目录

也称为动态库文件,它包涵了代码和数目(那个多少是在接连时候被连接器ld和周转时动态连接器使用的)。动态连接器也许称为ld.so.1,libc.so.1也许 ld-linux.so.1。作者的CentOS6.0系统中该公文为:/lib/ld-2.12.so

 

1.4 库文件是如何发生的在linux下

静态库的后缀是.a,它的发出分两步

1.由源文件编写翻译生成一群.o,各样.o里都富含那个编写翻译单元的符号表

2.ar命令将非常多.o调换来.a,成为静态库

动态库的后缀是.so,它由gcc加一定参数编写翻译产生。

具体方法参见后文实例。

静态库*.a文件的留存器重是为了协助较老的a.out格式的可施行文件而存在的。近日用的最多的要数动态库了。

 

 2.5 思路三:动态链接库(分享函数库)

我们世襲看看哪些在linux中创立动态库。依然从.o文件早先。

动态库文件名命名规范和静态库文件名相像,也是在动态库名扩充前缀lib,但其文件扩大名称叫.so。举例:我们将创立的动态库名称叫myhello,则动态库文件名正是libmyhello.so。用gcc来创制动态库:

1)第一步:生成hello.o指标文件,使用如下命令。在那地必要增加-fPIC参数,该参数用于转移地点无关代码,以供生成动态库使用:

gcc  -c  -o  hello.o  -fPIC  hello.c

2)第二步:使用-shared参数生成动态库:

gcc  -shared  -o  libmyhello.so  hello.o

上述七个指令能够连在一齐:

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

在程序中使用动态库和使用静态库完全相同,也是在应用到这么些公用函数的源程序中含有这个公用函数的原型评释,然后再用gcc命令生成目的文件时指明动态库名实行编译。大家先运维gcc命令生成指标文件,再运转它看看结果。

借使向来用如下方法开展编写翻译,并接连:

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

(使用"
-lmyhello"标志来报告GCC驱动程序在连续阶段援引共享函数库libmyhello.so。"-L."标志告诉GCC函数库只怕坐落于当前目录。注:"."表示当前目录)

奉行目的程序:

$ ./hello

出错

./hello: error while loading shared libraries: libmyhello.so: cannot open shared object 

指鹿为马提示:找不到动态库文件libmyhello.so。程序在运行时,会招来需求的动态库文件,顺序参考后文介绍。若找到,则载入动态库,不然将唤起类似上述乖谬而停下程序运转。有三种艺术能够消除:

1)大家将文件libmyhello.so复制到目录/usr/lib中,再尝试。

$  sudo  mv  libmyhello.so  /usr/lib

$  ldconfig -v

2)既然连接器会搜寻LD_LIBRARY_PATH所内定的目录,那么大家能够将当前目录加入这几个情况变量中

export  LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) :$(pwd)

3)将当前目录写入/etc/ld.so.conf中,然后推行ldconfig
-v命令,将动态库写入/etc/ld.so.cache文件。

科学安装后,执行./hello就可以施行顺序。

能够查看它是怎么着调用动态库中的函数的。

linux-vdso.so.1 => (0x00007fffe8f9b000) 
libmyhello.so => /home/chenjw/testso/libmyhello.so (0x00007fbe807d5000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbe80410000) 
/lib64/ld-linux-x86-64.so.2 (0x000055dc016c2000)

 

图片 2

静态库文件libmytest.a已经改换,用file命令查看其属性,开采它实在是归档压缩文件。用ar
-t libmytest.a可以查看三个静态库富含了那多少个obj文件:

意气风发、基本概念

可试行文件包罗了代码和数目,是足以一向运转的主次。

图片 3

1.2 库的项目

linux下的库有二种:静态库和共享库(动态库)。

多头的不相同点在于代码被载入的随即不一样。

静态库的代码在编写翻译进度中早已被载入可执路程序,由此容量十分的大。

共享库的代码是在可执路程序运营时才载入内存的,在编写翻译进程中仅简单的援引,因而代码体量极小。

今日我们根本来讲说Linux系统下基于动态库(.so卡塔尔国和静态(.a卡塔尔国的前后相继那多少个猫腻。在在此之前面,咱们须求掌握一下源代码到可执路程序之间究竟产生了什么样美妙而优质的职业。

四个ELF文件从连接器(Linker)的角度看,是某些节的成团;从程序加载器(Loader)的角度看,它是有的段(Segments)的集结。ELF格式的顺序和分享库具备雷同的构造,只是段的聚合和节的聚合上稍加分歧。
那么到底怎么样是库呢?
库从精气神儿上来讲是风华正茂种可施行代码的二进制格式,可以被载入内部存储器中实践。库分静态库和动态库三种。
静态库:那类库的名字平日是libxxx.a,xxx为库的名字。利用静态函数库编写翻译成的公文十分大,因为任何函数库的具备数据都会被整合进目的代码中,他的独特之处就显然了,即编写翻译后的实践顺序无需外表的函数库补助,因为具备应用的函数都早已被编写翻译进去了。当然那也会形成她的劣点,因为若是静态函数库改造了,那么您的次序必需再度编写翻译。
动态库:那类库的名字平时是libxxx.M.N.so,相符的xxx为库的名字,M是库的主版本号,N是库的副版本号。当然也得以不用版本号,但名字必需有。相对于静态函数库,动态函数库在编写翻译的时候并未被编写翻译进指标代码中,你的程序实践到相关函数时才调用该函数Curry的对应函数,由此动态函数库所发出的可施行文件相当小。由于函数库未有被整合进你的次序,而是程序运转时动态的报名并调用,所以程序的运作景况中必得提供相应的库。动态函数库的变动并不影响您的前后相继,所以动态函数库的进步比较便于。linux系统有多少个根本的目录贮存相应的函数库,如/lib
/usr/lib。
当要利用静态的程序库时,连接器会找寻程序所需的函数,然后将它们拷贝到实施文书,由于这种拷贝是共同体的,所以只要一而再成功,静态程序库也就不再须要了。然而,对动态库来讲,就不是这么。动态库会在施行顺序内留下三个标识指明当程序试行时,首先必需载入那么些库。由于动态库节省空间,linux下张开接二连三的缺省操作是率先连接动态库,也便是说,如若还要设有静态和动态库,不特地钦赐的话,将与动态库相连接。

二、用gcc生成静态库和动态链接库的身体力行

大家司空眼惯把部分公用函数制作成函数库,供其他程序接纳。

函数库在程序编写翻译时会被链接到目的代码中,程序运转时将不再供给该静态库。

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

本文首要透过比世尊表达在linux中如何创立静态库和动态库,以以致用它们。

为了有助于阐明,大家先做一些预备干活。

不时当我们的应用程序不也许运转时,它会提示大家说它找不到什么样的库,或然哪些库的本子又不合它胃口了等等等等的话。那么应用程序它是怎么领会需求怎么着库的呢?大家前边已多少个学了个很棒的命令ldd,用正是用来查看叁个文书到底信任了那几个so库文件。

图片 4

2.3 思路意气风发:编写翻译几个源文件

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

gcc  -c  hello.c

为何不使用gcc -o hello
hello.c那些道理大家前边曾经说了,使用-c是哪些意思啊?那涉及到gcc编写翻译选项的常识。

gcc
-o是将.c源文件编写翻译成为二个可施行的二进制代码(-o选项其实是点名输出文件名,倘若不加-c选项,gcc暗中同意会编写翻译连接生成可实践文件,文件的称谓由-o选项内定),那满含调用作为GCC内的风姿洒脱有个别——真正的C编写翻译器(ccl),以至调用GNU
C编写翻译器的输出中实际上可进行代码的表面GNU汇编器(as)和连接器工具(ld)。

gcc
-c是使用GNU汇编器将源文件转载为对象代码之后就截至,在此种景观下,只调用了C编写翻译器(ccl)和汇编器(as),而连接器(ld)并从未被施行,所以输出的对象文件不会含有作为Linux程序在棉被服装载和实行时所不可不的饱含信息,但它可以在其后被接连到一个程序。

大家运转ls命令看看是或不是变动了hello.o文件。

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

在ls命令结果中,我们看出了hello.o文件,本步操作落成。

同理编写翻译main

gcc  -c main.c

将三个文本链接成二个.o文件。

gcc  hello.o  main.o  -o  hello

运行

$ ./hello

Hello everyone!

完成!

图片 5

 

1.5 库文件是哪些命名的,有未有正统

在linux下,库文件平时放在/usr/lib和/lib下,

静态库的名字平日为libxxxx.a,当中xxxx是该lib的称呼

动态库的名字日常为libxxxx.so.major.minor,xxxx是lib的名号,major是主版本号,minor是副版本号

图片 6

file /usr/bin/pkg-config
/usr/bin/pkg-config: ELF
64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked
(uses shared libs), for GNU/Linux 2.6.18, stripped

1.1 什么是库

在Windows平台和Linux平台下都大量留存着库。

本质上的话,库是大器晚成种可实行代码的二进制情势,能够被操作系统载入内部存款和储蓄器实践。

是因为windows和linux的阳台不一样(首倘使编译器、汇编器和连接器的例外),因而双方的库的二进制是不合营的。

本文只限于介绍linux下的库。

咱俩先构建本人的静态链接库,然后再使用它。制作静态链接库的经过中要用到gcc和ar命令。

图片 7

2.4思路二:静态链接库

上面大家先来看看哪些成立静态库,以至采用它。

静态库文件名的命名标准是以lib为前缀,紧接着跟静态库名,扩展名称叫.a。举例:大家将创设的静态库名称为myhello,则静态库文件名就是libmyhello.a。在创造和接收静态库时,须求潜心那一点。创设静态库用ar命令。

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

$ ar  rcs  libmyhello.a  hello.o

我们同样运转ls命令查看结果:

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

ls命令结果中有libmyhello.a。

静态库制作完了,怎么着运用它在那之中的函数呢?只须求在行使到那些公用函数的源程序中隐含那几个公用函数的原型评释,然后再用gcc命令生成可施行文件时指明静态库,gcc将会从静态库大校公用函数连接到可推行文件中。注意,gcc会在静态库名前加上前缀lib,然后追加扩展名.a获得的静态库文件名来探求静态库文件,因而,大家在写供给一而再连续的库时,只写名字就足以,如libmyhello.a的库,只写:myhello。

在前后相继3:main.c中,大家包罗了静态库的头文件hello.h,然后在主程序main中平素调用公用函数hello。

下边先生成指标程序hello,然后运营hello程序看看结果怎么着。

$  gcc  -o  hello  main.c  -static  -L.  -lmyhello

$  ./hello

Hello everyone!

小编们删除静态库文件试试公用函数hello是或不是真正连接到目标文件hello中了。

$  rm  libmyhello.a

$  ./hello

Hello eceryone!

程序照常运作,表明静态库中的公用函数已经接二连三到指标程序中了。

静态链接库的多个毛病是,假设还要运维了好多顺序,何况它们利用了同三个库函数,那样,在内部存款和储蓄器中会大量正片同风流洒脱库函数。那样,就能够浪费广大珍奇的内部存款和储蓄器和存款和储蓄空间。使用了分享链接库的linux就足以幸免那个主题素材。

当一个顺序接受分享函数库时,在连年阶段并不把函数代码连接进来,而只是链接函数的一个援引。当最终的函数导入内部存款和储蓄器起初真的举办时,函数引用被拆解解析,分享函数库的代码才真的导入到内部存款和储蓄器中。那样,分享链接库的函数就足以被不菲主次同临时间分享,並且只需存放一回就能够了。共享函数库的另三个独特之处是,它能够单独更新,与调用它的函数毫不影响。

1、静态链接库

接下去大家就写个测量检验程序来调用库libmytest.a中所提供的五个接口print1(State of Qatar和print2(卡塔尔国。

1.3 仓库储存在的意思

库是旁人写好的依存的,成熟的,能够复用的代码,你能够应用,但要记得坚决守住许可合同。

现实中种种程序都要的话非常多功底的最底层库,不可能种种人的代码都从零起头,由此库的存留意义特别。

分享库的功利是,分歧的应用程序倘若调用相像的库,那么在内部存款和储蓄器里只须要有黄金年代份该分享库的实例。

下一场/etc/ld.so.conf.d/目录下贮存了过多*.conf文件,如下:

其实PKG_CONFIG_PATH和LD_LIBRARY_PATH平常被很四人误用,特别是新手们在消除难点时,也不分青红皁白,逮着了正是意气风发顿狂export,依据实际场馆,运气好了大概难点还真就解决,点儿背了折磨一天半宿也是白忙活。其实假设留点心,照旧挺轻便了解的:
PKG_CONFIG_PATH从字面意思上翻译,便是“软件包的布署路线”,那不很分明了么,编译软件时只要现身找不到所依赖的动态库时都全靠PKG_CONFIG_PATH了;
LD_LIBRARY_PATH也很直白了“装载器的库路径”,LD是Loader的简写,在博文“段错误到底是哪个地方妖孽”里本人也曾提到过,在Linux系统运转二个前后相继的历程就称为装载,多个主次要实践时它或多或少的会依赖一些动态库(静态编写翻译的不外乎卡塔尔国。当您用“ldd
可执路程序名”查看一个软件运行时所依附的动态库,固然出口项有“libxxx.so.y=>
not found”黄金年代项,你这几个软件100%运维不起来。

1.8 在新装置叁个库随后怎么着让系统能够找到它

要是设置在/lib也许/usr/lib下,那么ld默许能够找到,不须求任何操作。

假诺设置在其他目录,须要将其增多到/etc/ld.so.cache文件中,步骤如下:

1.vi编辑/etc/ld.so.conf
文件,参加库文件所在目录的门路

2.运转ldconfig -v ,该命令会重新创设/etc/ld.so.cache缓存文件

1)ldconfig命令的用场重若是在暗中认可找寻目录/lib和/usr/lib以致动态库配置文件/etc/ld.so.conf内所列的目录下,寻找出可分享的动态链接库(格式如lib*.so*),进而创设出动态装入程序(ld.so)所需的三番两遍和缓存文件。缓存文件默以为/etc/ld.so.cache。ldconfig平常在系统运行时运维,而当客户设置一个新的动态链接库时,就要求手工业运维这么些命令。

2)/etc/ld.so.cache包罗了在/etc/ld.so.conf中钦定的目录中查找到的保有链接库,按顺序存款和储蓄。

 

Linux下,大家能够用gcc -c编写翻译源文件时可将其编写翻译成*.o格式。

ll /etc/ld.so.conf
-rw-r--r-- 1 root root 64 May 7 13:28 /etc/ld.so.conf

 

2、动态库

其间每一种conf文件表示了后生可畏种选用的库配置内容,以mysql为例:

图片 8

pkg-config在寻找对应软件包的音讯时的缺省搜索路线已经很清楚了,有少数写错了,不是${libdir}/pkg-config,而应该是${libdir}/pkgconfig和${datadir}/pkgconfig。即使您软件包对应的pc文件都不在这里七个目录下时,pkg-config断定找不到。既然原因都早已找到了,那解决办法也就巨细无遗了。
方案意气风发:大家得以在装置大家丰硕被重视的软件包时,在configure阶段用--prefix参数把安装目录内定到/usr目录下;
方案二:也能够根据地方说的,通过二个可以称作PKG_CONFIG_PATH的意况变量来向pkg-config指明咱们本人的pc文件所在的门径,然而要在乎的是PKG_CONFIG_PATH所钦赐的路径优先级比较高,pkg-config会先进行查找,完了之后才是去搜求缺省路线。
后面一个的长处是后来再通过源码安装软件时少了无数劳动,缺点是客商本人的软件包和系统软件混到一同不方便管理,所以其实选取中,后面一个用的要多一些。

GCC是Linux下重要的前后相继生成工具,它除了编写翻译器、汇编器、连接器外,还饱含部分扶助理工科程师具。在上面包车型客车解析进度中小编会教我们那一个工具的中坚接受办法,Linux的有力的地方在于,对于不太懂的指令或函数,有多少个很强大的“匹夫”时刻stand
by your side,有啥不会的就去命令行终端输入:man
[命令名或函数名],然后阿拉神灯就能够显灵了。

 

转载本站文章请注明出处:vns威尼斯城官网登入 http://www.tiec-ccpittj.com/?p=4519

上一篇:

下一篇:

相关文章