linux 配置和加载动态库 ldconfig
GCC编译C++程序的那些步骤,其中包括编译的时候include的搜索目录,链接的时候库的搜索目录(这里的库包含两种库)。还有一个时候,需要搜索路径,那就是装载动态库的时候,这个时候与GCC无关了。而是与linux系统自身有关系。 动态转载动态库,是为了基于动态库编译链接而来的可执行程序设定的一个程序执行过程中需要的功能,对于那些只基于静态库的可执行程序来说,这个功能没有什么用。
GCC编译C++程序的那些步骤,其中包括编译的时候include的搜索目录,链接的时候库的搜索目录(这里的库包含两种库)。还有一个时候,需要搜索路径,那就是装载动态库的时候,这个时候与GCC无关了。而是与linux系统自身有关系。
动态转载动态库,是为了基于动态库编译链接而来的可执行程序设定的一个程序执行过程中需要的功能,对于那些只基于静态库的可执行程序来说,这个功能没有什么用。
1)执行这个动作的linux程序:
2)这个程序参考的文件为:/etc/ld.so.conf,该文件保存着ld应该搜索的so文件路径。通常ld.so.conf.d这个文件夹下也保存着分文件,以供合成ld.so.conf
3)该程序实际参考的文件为:/etc/ld.so.cache.这个文件会其实基本上就是对/etc/ld.so.cache 做了稍微的处理利于/usr/bin/ld程序的参考。
4)将/etc/ld.so.conf 更新到/etc/ld.so.cache.的命令: ldconfig. 使用 ldconfig -p|less可以逐步查看从/usr/bin/ld 眼里的/etc/ld.so.cache的内容(路径)。
5)所以往/etc/ld.so.conf内做指定的路径,如/usr/lib等加入你需要程序搜索的动态库.so文件,不需要执行ldconfig更新。因为/etc/ld.so.cache中保存的就是目录,而不是具体的so文件。
6)向/etc/ld.so.conf添加路径。则需要调用ldconfig来更新/usr/bin/ld的搜索路径。
运行时动态库的搜索路径:
动态库的搜索路径搜索的先后顺序是:
①编译目标代码时指定的动态库搜索路径(这是通过gcc 的参数"-Wl,-rpath,"指定。当指定多个动态库搜索路径时,路径之间用冒号":"分隔)
②环境变量LD_LIBRARY_PATH指定的动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)
③配置文件/etc/ld.so.conf中指定的动态库搜索路径;
④默认的动态库搜索路径/lib;
⑤默认的动态库搜索路径/usr/lib。
也就是说,虽然linux以装载动态库时搜索的路径以/etc/ld.so.conf为主,但是,仍然有其它的方式,来构建这种装载路径的灵活性。仍然是遵守那种先“专”后“宽”的模式去缩短可能的搜索时间。
第一个,就是在编译连接该程序的时候,就指定将来需要动态库的时候搜索的位置。注意这个与当时的链接路径虽然有很大的关系,但是他们的概念是不同的。
第二个,也就是在使用/etc/ld.so.conf之前,还有一个路径设置方法就是环境变量LD_LIBRARY_PATH. 这个东西可以使用:
# export LD_LIBRARY_PATH=”/usr/lib/old:/opt/lib 来创建修改这个变量。
第三个,才是/etc/ld.so.conf
最后。则是系统默认路径。
(2) 静态链接库和动态链接库的使用区别
首先,回顾一点,一个程序,从源代码到运行,包括:编译(compile)、链接(link)、加载(load)、运行(execute),对应的GNU工具一般为:编译器compiler(gcc)、链接器linker(ld)、加载器loader(其中动态链接库加载器为ld.so(ld-linux.version.so),在/lib目录中,如 /lib/ld-linux.so.2,所以不能直接在命令行下运行ld-linux.so,需要完整路径,加载器一般不需要我们直接运行,在运行可执行程序的加载过程中包含有动态加载的过程)。经常会将编译和链接统称为编译,期间为编译时(compile time);而加载和运行统称为运行,期间为运行时或执行时(runtime/execution time)。
静态链接库:编译时(compile time)被使用(更详细的是链接的时候)。在链接静态库的时候,链接器会在其中找到所需要链接的函数,然后将它们拷贝到执行文件,这种拷贝是完整的拷贝,所以在链接成功后,程序运行不需要静态库的参与。
动态链接库:编译时和运行时都被使用。在编译时,链接器在其中找到所需要的函数(或其他对象文件),生成地址/位置无关代码(Position Independent Code (PIC)),并没有真正的实现拷贝;在运行时(runtime/execution-time),某个程序在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了,如果有,则让其共享那一个拷贝;只有没有才链接载入。
说明:Linux下进行链接的缺省操作是先考虑动态链接库,即如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。
更多推荐
所有评论(0)