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

时间:2015-01-11 10:57:32

标签: c++

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

2 个答案:

答案 0 :(得分:1)

虽然您描述的任务通常以不同的方式解决,但这里是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 %s\n", dlInfo.dli_fname);
    else
        printf("It's strange but puts is not found\n");
    puts("Hello, world! I'm foo!");
}

此处使用dladdr确定puts函数的来源。

对于Windows,请参阅this recipe

当我告诉任务解决不同时,我的意思是以下内容。在Linux(以及类似于unix的系统&#34;)中,共享库与其他应用程序数据分开。 (前者位于/lib/lib64/usr/lib/usr/lib64,具体取决于目标平台,&#34;特定图书馆的重要性以及其他因素,后者通常会转到/usr/share/<appname>)。这是图书馆获得帮助的途径。应用程序数据文件的路径通常在编译期间配置,有时 - 通过应用程序配置中的专用设置。

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

答案 1 :(得分:0)

感谢您的回答。据我所知,现在获取路径过于复杂,并且不能跨平台兼容。将文件嵌入可执行文件似乎更好。

修改:我找到了

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

这真的很容易使用。