ubuntu 应用程序都会去什么目录获取动态库

1.概要

2.内容

在Ubuntu系统中,应用程序获取动态库(.so文件)的目录主要由以下几个方面决定:

一、默认搜索路径

  1. /lib:这是一个标准的系统目录,用于存放系统级的动态库。
  2. /usr/lib:这是另一个重要的系统目录,同样用于存放系统级的动态库。

二、环境变量指定的路径

  1. LD_LIBRARY_PATH:这是一个环境变量,用于指定动态库的搜索路径。当程序运行时,它会首先在这个变量指定的路径中查找所需的动态库。如果设置了LD_LIBRARY_PATH,系统会优先在这个变量指定的路径中查找动态库。

三、编译时指定的路径

  1. rpath:在编译应用程序时,可以使用-Wl,-rpath选项指定动态库的搜索路径。这些路径会在系统默认路径之前被考虑。rpath是绝对的,它指定的是可执行文件运行时的相对路径。
  2. runpath:与rpath类似,但它是相对的,指定的是可执行文件安装时的相对路径。runpath会在系统默认路径之后继续搜索。

四、通过ldconfig配置的路径

  1. /etc/ld.so.conf:这是一个系统配置文件,其中可以包含动态库搜索路径的列表。编辑该文件,向其中添加动态库的搜索路径,然后使用sudo ldconfig命令更新动态库缓存。这种方式对所有用户生效,但需要管理员权限。
  2. /etc/ld.so.conf.d/:这是一个目录,用于存放包含动态库搜索路径的配置文件。每个文件通常包含一个搜索路径,文件名没有特定要求。这种方式便于管理不同的动态库路径。

五、动态加载

  1. dlopen:在程序运行时,通过调用dlopen函数可以动态加载动态库。这种方式下,程序可以在需要时加载动态库,而不需要在编译时指定。

六、软链接

如果动态库位于非标准路径,可以在标准路径(如/usr/lib/lib)下创建指向该动态库的软链接。这种方式对所有用户生效,且不需要修改环境变量或系统配置文件。

七、动态库加载顺序

在Ubuntu系统中,当一个应用程序需要加载一个动态库时,系统会按照一定的顺序查找这些库:

  1. 编译时指定的run path。
  2. LD_LIBRARY_PATH指定的路径。
  3. ldconfig指定的路径(即/etc/ld.so.conf/etc/ld.so.conf.d/中配置的路径)。
  4. 系统默认路径,包括/lib/usr/lib

总结

综上所述,Ubuntu应用程序获取动态库的目录主要包括系统默认路径(如/lib/usr/lib)、环境变量指定的路径(如LD_LIBRARY_PATH)、编译时指定的路径(如rpath和runpath)、通过ldconfig配置的路径(如/etc/ld.so.conf/etc/ld.so.conf.d/),以及通过软链接或动态加载方式指定的路径。在实际应用中,可以根据需要选择合适的方式来配置动态库的搜索路径。

3.关联链接

4.关联知识

1.编译时指定的路径

在编译时,可以通过编译器选项指定动态库(共享库)的搜索路径。这通常使用GCC编译器及其链接器选项来实现。以下是关于编译时指定动态库搜索路径的详细解释:

编译器选项

在编译时,可以通过GCC的-L选项指定链接器搜索动态库的路径。例如:

gcc -o my_program my_program.c -L/path/to/library -lmylibrary

在这个例子中:

  • -o my_program:指定输出文件名为my_program
  • -L/path/to/library:指定链接器搜索动态库的路径为/path/to/library
  • -lmylibrary:指定链接器要链接的动态库名为mylibrary(注意:这里不需要指定动态库的前缀lib和后缀.so)。

rpath 和 runpath 选项

除了-L选项外,还可以使用-Wl,-rpath-Wl,-runpath选项来指定动态库的运行时搜索路径。这些选项会在可执行文件中嵌入路径信息,以便程序运行时能够找到所需的动态库。

  • -Wl,-rpath=/path/to/library:指定动态库的运行时搜索路径。rpath是绝对的,它指定的是可执行文件运行时的相对路径。
  • -Wl,-runpath=/path/to/library:与rpath类似,但runpath是相对的,它指定的是可执行文件安装时的相对路径。

示例

假设我们有一个程序my_program.c,它依赖于动态库libmylibrary.so,而这个库位于/home/user/libs目录下。我们可以按照以下步骤进行编译:

  1. 编译并链接程序

    gcc -o my_program my_program.c -L/home/user/libs -lmylibrary -Wl,-rpath=/home/user/libs

    这里,-L/home/user/libs告诉链接器在编译时搜索动态库的路径,-lmylibrary指定要链接的动态库名,-Wl,-rpath=/home/user/libs指定动态库的运行时搜索路径。

  2. 运行程序

    ./my_program

    当运行my_program时,系统会在/home/user/libs目录中查找libmylibrary.so动态库。

注意事项

  • 使用rpath或runpath时,应谨慎指定绝对路径,因为这会使得可执行文件对运行环境有依赖。如果可能,尽量使用相对路径。
  • 在多用户环境中,修改系统级的动态库路径(如通过编辑/etc/ld.so.conf文件)需要管理员权限,并且可能会影响系统上所有使用动态库的程序。因此,通常建议通过环境变量或编译时选项来指定动态库路径。
  • 在使用动态库时,确保库的版本兼容性,以避免运行时错误。

通过以上方法,可以在编译时指定动态库的搜索路径,确保程序在运行时能够找到所需的动态库。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值