Linux系统程序运行时加载动态库路径顺序

程序运行时加载动态库路径顺序(Linux)
在linux系统中,如果程序需要加载动态库,它会按照一定的顺序(优先级)去查找:
在这里插入图片描述
链接时路径(Link-time path)和运行时路径(Run-time path)不是一回事,当然,当你知道这个概念的时候,你当然明白。

那么自制的库在没有指定运行时库的路径时,一般是不会找到你特定目录的,先来说说链接库的搜寻顺寻:

1.编译目标代码时指定的动态库搜索路径(指的是用-wl,rpath或-R选项而不是-L);

example: gcc -Wl,-rpath,/home/arc/test,-rpath,/lib/,-rpath,/usr/lib/,-rpath,/usr/local/lib test.c

2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;(export LD_LIBRARY_PATH=/root/test/env/lib)

3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;(更改/etc/ld.so.conf文件后记得一定要执行命令:ldconfig!该命令会将/etc/ld.so.conf文件中所有路径下的库载入内存中)

4.默认的动态库搜索路径/lib;

5.默认的动态库搜索路径/usr/lib。

在命令前加环境变量设置,该环境变量只对该命令有效,当该命令执行完成后,该环境变量就无效了。如下述命令:# LD_LIBRARY_PATH=/root/test/env/lib ./pos

下面对编译时库的查找与运行时库的查找做一个简单的比较:

1. 编译时查找的是静态库或动态库,而运行时,查找的只是动态库。

2. 编译时可以用-L指定查找路径,或者用环境变量LIBRARY_PATH,而运行时可以用-Wl,rpath或-R选项,或者修改/etc/ld.so.conf文件或者设置环境变量LD_LIBRARY_PATH.

3. 编译时用的链接器是ld,而运行时用的链接器是/lib/ld-linux.so.2.

4. 编译时与运行时都会查找默认路径:/lib  /usr/lib

5. 编译时还有一个默认路径:/usr/local/lib,而运行时不会默认找查该路径。

环境变量LIBRARY_PATH可以指定编译时搜索动态库的路径;
环境变量LD_LIBRARY_PATH可以指定程序运行时动态库搜索和加载的路径;

cmake  . -G "Eclipse CDT4 - Unix Makefiles"  -DCMAKE_SYSTEM_NAME=Linux

根据cmake官方关于交叉编译的介绍: 《Cross Compiling for Linux》,CMAKE_SYSTEM_NAME和CMAKE_SYSTEM_PROCESSOR是交叉编译的时候必须指定的两个参数。

所以如果在cmake命令行定义了CMAKE_SYSTEM_NAME,就必须也定义CMAKE_SYSTEM_PROCESSOR,如下。

cmake  . -G "Eclipse CDT4 - Unix Makefiles"  \
	-DCMAKE_SYSTEM_NAME=Linux \
	-DCMAKE_SYSTEM_PROCESSOR=x86_64

如果在命令行只是定义了CMAKE_SYSTEM_NAME,就会出现CMAKE_SYSTEM_PROCESSOR为空这种奇怪的问题。

另外经测试如果在CMakeLists.txt脚本中用set命令设置CMAKE_SYSTEM_NAME的值,并不会影响CMAKE_SYSTEM_PROCESSOR的值:

set(CMAKE_SYSTEM_NAME Linux)

 (815条消息) Linux系统程序运行时加载动态库路径顺序_guoqiang_sunshine的博客-CSDN博客_linux 动态库加载路径

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#编程中,动态库是一个非常重要的概念,它可以让我们复用代码,提高程序的效率和可维护性。但是,在使用动态库时,我们需要知道它的路径顺序,才能正确地引入和使用它。本文将结合实例,介绍C#搜索动态库路径顺序。 一、什么是动态库? 在C#编程中,动态库是指一种可以被程序动态加载的库文件。它包含了一些可以被程序调用的函数、变量和类等。动态库的优点在于可以被多个程序复用,可以减少代码的重复编写,提高程序的效率和可维护性。 常见的动态库格式包括: 1. DLL(Dynamic Link Library):Windows平台上常用的动态库格式。 2. SO(Shared Object):Linux平台上常用的动态库格式。 3. DYLIB(Dynamic Library):MacOS平台上常用的动态库格式。 二、动态库路径顺序 在使用动态库时,我们需要知道它的路径顺序,才能正确地引入和使用它。一般来说,C#会按照以下顺序搜索动态库: 1. 程序所在的目录 2. 环境变量PATH中指定的目录 3. 系统默认的目录 程序所在的目录是指运行程序的可执行文件所在的目录。一般情况下,我们可以将动态库放在程序所在的目录下,以便程序可以直接加载它。 环境变量PATH中指定的目录是指在系统环境变量中设置的目录,C#会按照环境变量PATH中的顺序搜索动态库。如果我们需要在程序中使用某个动态库,但是它不在程序所在的目录下,可以将它放在环境变量PATH中指定的目录下,或者将它的路径添加到环境变量PATH中。 系统默认的目录是指操作系统默认的目录,C#会按照操作系统的规定搜索动态库。例如,在Windows操作系统中,C#会搜索Windows系统目录和Windows系统目录下的子目录,以及注册表中指定的路径。 三、实例演示 下面,我们将演示如何使用C#搜索动态库路径顺序。 1. 在程序所在的目录下创建一个动态库mylib.dll,包含一个函数Add和一个类MyClass。 ``` // mylib.dll using System; namespace MyLib { public class MyClass { public int Value { get; set; } public MyClass(int value) { Value = value; } public int Add(int a, int b) { return a + b; } } } ``` 2. 在程序中使用mylib.dll中的函数和类。 ``` // Program.cs using System; using MyLib; namespace SearchDLL { class Program { static void Main(string[] args) { // 找到mylib.dll的路径 string dllPath = FindDLL("mylib.dll"); // 加载mylib.dll Assembly assembly = Assembly.LoadFrom(dllPath); // 使用mylib.dll中的函数和类 MyClass myClass = new MyClass(10); Console.WriteLine(myClass.Add(1, 2)); Console.ReadLine(); } // 查找动态库路径 static string FindDLL(string dllName) { // 程序所在的目录 string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, dllName); if (File.Exists(path)) { return path; } // 环境变量PATH中指定的目录 string[] dirs = Environment.GetEnvironmentVariable("PATH").Split(';'); foreach (string dir in dirs) { path = Path.Combine(dir, dllName); if (File.Exists(path)) { return path; } } // 系统默认的目录 path = Path.Combine(Environment.SystemDirectory, dllName); if (File.Exists(path)) { return path; } throw new FileNotFoundException($"找不到动态库{dllName}!"); } } } ``` 在上面的代码中,我们首先定义一个名为mylib.dll的动态库,包含一个类MyClass和一个函数Add。然后,在程序中调用FindDLL函数查找动态库mylib.dll的路径。FindDLL函数会按照C#搜索动态库路径顺序搜索动态库,找到动态库后,使用Assembly.LoadFrom函数加载动态库,并使用其中的函数和类。 四、总结 本文介绍了C#搜索动态库路径顺序,并结合实例演示了如何使用C#搜索动态库路径顺序。在使用动态库时,我们需要注意动态库路径顺序,以便程序可以正确地引入和使用动态库

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值