在运行时确定 *.dll 或 *.so 的路径

Determine the path of a *.dll or *.so at runtime

本文关键字:so 路径 dll 运行时      更新时间:2023-10-16

C++库必须从与库位于同一目录中的磁盘读取文件。我不知道这个问题是微不足道的还是不可能的:库如何确定自己的磁盘路径?该解决方案应该适用于Linux(.so)和Windows(.dll)。

尽管您描述的任务通常以不同的方式解决,但以下是Linux的解决方案:

#define _GNU_SOURCE
#include <stdio.h>
#include <dlfcn.h>
void foo() {
    Dl_info dlInfo;
    dladdr(puts, &dlInfo);
    if (dlInfo.dli_sname != NULL && dlInfo.dli_saddr != NULL)
        printf("puts is loaded from %sn", dlInfo.dli_fname);
    else
        printf("It's strange but puts is not foundn");
    puts("Hello, world! I'm foo!");
}

这里puts函数的来源是使用 dladdr 确定的。

对于Windows,请参阅此配方

当我告诉任务以不同的方式解决时,我的意思如下。在Linux(以及"典型的类Unix系统")中,共享库与其他"应用程序数据"分开(前者驻留在/lib/lib64/usr/lib/usr/lib64,取决于目标平台,"特定库的重要性"和其他因素,后者通常转到/usr/share/<appname>)。这是通往图书馆的途径不会帮助你。应用程序数据文件的路径通常在编译期间配置,有时通过应用程序配置中的专用设置进行配置。

对于那些打算安装到/opt/或其他"特殊位置"的"第三方"应用程序,例如/usr/local应用程序数据的路径是根据应用程序的路径计算的,而应用程序路径通常是根据应用程序二进制位置确定的,这可以从main()参数中知道。当然,您的案例可能需要特殊的布局,但记住这些注意事项很有用。

谢谢你的回答。据我了解,现在获取路径过于复杂,并且跨平台不兼容。似乎最好将文件嵌入可执行文件中。

编辑:我发现

http://www.fourmilab.ch/xd/

这真的很容易使用。