共 1 篇文章

标签:Linux环境变量之LD:动态链接库的重要组成部分 (linux 环境变量 ld)

Linux环境变量之LD:动态链接库的重要组成部分 (linux 环境变量 ld)

在Linux操作系统中,环境变量是一个非常重要的概念。它们是操作系统在运行过程中使用的一些特殊变量,它们用于存储一些特殊的数据,例如系统路径、程序调用参数等等。其中一个非常重要的环境变量是LD_LIBRARY_PATH,它用于指定程序运行时所依赖的动态链接库的路径。在本文中,我们将讨论LD环境变量的作用和使用方法。 什么是动态链接库? 动态链接库是一种特殊的程序库,它包含一些可重用的代码和数据,可供不同的程序使用。使用动态链接库的程序将链接到这个库,从而使用其中的代码和数据。相对于静态链接库,动态链接库的更大好处在于它可以减少程序的内存占用和磁盘空间占用。这是因为不同的程序可以共享同一个动态链接库,并且不同版本的动态链接库可以被系统自由地管理。 在Linux系统中,动态链接库文件通常以.so结尾。例如,libc.so是一个系统标准库,它包含所有标准C函数的定义。当我们编译一个程序时,编译器会自动链接libc库,从而使我们的程序可以使用这些函数。 LD_LIBRARY_PATH环境变量的作用 LD_LIBRARY_PATH环境变量用于指定程序运行时所依赖的动态链接库的路径。当程序需要使用一个动态链接库时,它将在LD_LIBRARY_PATH中指定的路径中搜索这个库。如果找到了这个库,程序将会加载它,从而可以使用其中的函数和数据。 LD_LIBRARY_PATH环境变量的使用方法 使用LD_LIBRARY_PATH环境变量很简单。我们只需要将所需的动态链接库的路径添加到LD_LIBRARY_PATH环境变量中即可。例如,假设我们的程序需要使用mylib.so这个动态链接库,而这个库在/home/usr/lib中,我们可以这样设置LD_LIBRARY_PATH环境变量: export LD_LIBRARY_PATH=/home/usr/lib 然后,我们就可以运行我们的程序了。程序将会在LD_LIBRARY_PATH中搜索mylib.so,如果找到了这个库,程序就会加载它,并使用其中的函数和数据。 需要注意的是,由于LD_LIBRARY_PATH是一个环境变量,它只在当前的shell会话中有效。如果我们需要在不同的终端或会话中使用相同的动态链接库路径,我们需要在每一个会话中都设置LD_LIBRARY_PATH环境变量。 在Linux操作系统中,动态链接库是一种非常重要的组成部分。使用动态链接库可以大大减少程序的内存占用和磁盘空间占用。使用LD_LIBRARY_PATH环境变量可以指定程序运行时所依赖的动态链接库的路径,从而使程序可以正确地加载库并使用其中的函数和数据。在使用LD_LIBRARY_PATH时,需要注意设置环境变量的有效范围。 相关问题拓展阅读: linux编译的c++程序位置 linux环境变量怎么配置 linux怎样设置环境变量配置文件 linux编译的c++程序位置 linux系统编神差孙译C++程序时头⽂件和库⽂件搜索路径 C++编译时,教科书中写道:#include “headfile.h”优先在当前⽬录查找头⽂件;#include 从系统默认路径查找头⽂件。先 前以为系统默认路径是环境变量$PATH指定的路径,在系统上⼀查,傻了眼: -bash-3.2$ echo$PATH /usr/local/bin:/bin:/usr/bin:/in:/usr/in:/usr/X11R6/bin:/usr/java/j2re1.4.0/bin:/usr/atria/bin:/ccase/bin:/home/devcomp 全是bin⽬录,$PATH是运⾏可执⾏⽂件时的搜索路径,与include头⽂件的搜索路径⽆关,可能不少⼈犯了我这样的错误。 头⽂件: 1. #include“headfile.h” 搜索顺序为: ①先搜索当前⽬录 ②然后搜索-I指定的⽬录 ③再搜索gcc的环境变量CPLUS_INCLUDE_PATH(C程序使⽤的是C_INCLUDE_PATH) ④最后搜索gcc的内定⽬录 /usr/include /usr/local/include /usr/lib/gcc/x86_64-redhat-linux/4.1.1/include 各⽬录存在相同⽂件时,先找到哪个使⽤哪个。 2. #include ①先搜索-I指定的⽬录 ②然后搜索gcc的环境变量CPLUS_INCLUDE_PATH ③最后搜索gcc的内定⽬录 /usr/include /usr/local/include /usr/lib/gcc/x86_64-redhat-linux/4.1.1/include 与上⾯的相同,各⽬录存在相同⽂件时,先找到哪个使⽤哪游链个。这⾥要注意,#include⽅式不会搜索当前⽬录! 这⾥要说下include的内定⽬录,它不是由$PATH环境变量指定的,⽽是由g++的配置prefix指定的(知道它在安装g++时可以指定,不知安 装后如何修改的,可能是修改配置⽂件,需要时再研究下): -bash-3.2$ g++ -v Using built-inspecs. Target:x86_64-redhat-linux Configured with:../configure –prefix=/usr –mandir=/usr/share/man–infodir=/usr/share/info –enable-shared –enable-threads=posix–enable-checking=release –with-system-zlib –enable-__cxa_atexit–disable-libunwind-exceptions –enable-libgcj-multifile–enable-languages=c,c++,objc,obj-c++,java,fortran,ada–enable-java-awt=gtk –disable-dssi –enable-plugin–with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre–with-cpu=generic –host=x86_64-redhat-linux Thread model:posix gcc version 4.1.(Red Hat 4.1.2-46) 在安装g++时,指定了prefix,那么内定搜索⽬录就是: Prefix/include Prefix/local/include Prefix/lib/gcc/–host/–version/include 编译时可以通过-nostdinc++选项屏蔽对内定⽬录搜索头⽂件。 库⽂件: 编译的时候: ①gcc会去找-L ②再找gcc的环境变量LIBRARY_PATH ③再找内定⽬录/lib /usr/lib/usr/local/lib 这是当初compilegcc时写在程序内的(不可配置的?) 运⾏时动态库的搜索路径: 动态库的搜索路径搜索的先后顺序是: ①编译⽬标代码时指定的动态库搜索路径(庆迹这是通过gcc 的参数”-Wl,-rpath,”指定。当指定多个动态库搜索路径时,路径之间⽤冒号”:”分隔) ②环境变量LD_LIBRARY_PATH指定的动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间⽤冒号”:”分隔) ③配置⽂件/etc/ld.so.conf中指定的动态库搜索路径; ④默认的动态库搜索路径/lib; ⑤默认的动态库搜索路径/usr/lib。 (应注意动态库搜寻路径并不包括当前⽂件夹,所以当即使可执⾏⽂件和其所需的so⽂件在同⼀⽂件夹,也会出现找不到so的问题,类同#include不搜索当前⽬录) ¥ 百度文库VIP限时优惠现在开通,立享6亿+VIP内容 立即获取 linux系统编译C++程序时头文件和库文件搜索路径 linux系统编译C++程序时头⽂件和库⽂件搜索路径 C++编译时,教科书中写道:#include “headfile.h”优先在当前⽬录查找头⽂件;#include 从系统默认路径查找头⽂件。先 前以为系统默认路径是环境变量$PATH指定的路径,在系统上⼀查,傻了眼: -bash-3.2$ echo$PATH /usr/local/bin:/bin:/usr/bin:/in:/usr/in:/usr/X11R6/bin:/usr/java/j2re1.4.0/bin:/usr/atria/bin:/ccase/bin:/home/devcomp 第 1 页 全是bin⽬录,$PATH是运⾏可执⾏⽂件时的搜索路径,与include头⽂件的搜索路径⽆关,可能不少⼈犯了我这样的错误。 头⽂件: 1. #include“headfile.h” 搜索顺序为: ①先搜索当前⽬录 ②然后搜索-I指定的⽬录 ③再搜索gcc的环境变量CPLUS_INCLUDE_PATH(C程序使⽤的是C_INCLUDE_PATH) 展开全文...

技术分享