「如何在Linux中使用动态库并设置当前路径」 (linux 动态库 当前路径)

如何在Linux中使用动态库并设置当前路径

在Linux下使用动态库可以大大节省内存空间,提高程序的执行效率。动态库又称共享库,在程序运行时才会被载入内存,与之相对的是静态库,它们在编译阶段就会被链接到程序中。本文将介绍如何在Linux中使用动态库,并设置当前路径。

一、动态库的介绍

动态库由多个模块组成,每个模块都是一个独立的二进制文件,它们可以相互依赖。在程序运行时,只有当需要使用某个模块时才会加载这个模块。这使得动态库比静态库更为灵活,在程序中经常被使用。

动态库的文件格式一般为.so,Linux中的库文件都安装在默认的系统路径下,如/usr/lib、/lib等,程序在编译时会自动链接到这些库文件。

二、使用动态库

在程序中使用动态库需要使用到动态链接库(ld)。在编译时,需要使用-l选项指定动态库的名字,编译器会在默认的库路径下查找这个库,并链接到程序中。

例如:

gcc -o myapp myapp.c -lm

其中,-lm表示链接到数学库(libm.so)。

如果动态库不在默认的库路径下,可以使用-L选项指定动态库的搜索路径。

例如:

gcc -o myapp myapp.c -L /usr/local/lib/ -lmylib

其中,-L /usr/local/lib/指定了动态库的搜索路径,-lmylib表示链接到名为libmylib.so的动态库。

三、设置当前路径

在程序中使用动态库时,程序会在默认的搜索路径中查找动态库,如果没有找到,那么程序就无法执行。为了避免这种情况的发生,可以将程序需要使用的动态库放在程序的当前路径下。

在Linux中,可以使用LD_LIBRARY_PATH环境变量来设置程序的当前路径。

例如:

export LD_LIBRARY_PATH=/home/user/mylibs/:$LD_LIBRARY_PATH

其中,/home/user/mylibs/是自定义的当前路径,$LD_LIBRARY_PATH是保留的环境变量,表示将当前路径添加到默认的搜索路径之前。

四、

本文介绍了在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)

展开全文

限免

导长图

转存到网盘

发送至微信

下载文档

北京百度网讯科技有限公司 版本号8.0.70

关于linux 动态库 当前路径的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 「如何在Linux中使用动态库并设置当前路径」 (linux 动态库 当前路径)