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

标签 c++

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 %s\n", dlInfo.dli_fname);
    else
        printf("It's strange but puts is not found\n");
    puts("Hello, world! I'm foo!");
}

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

对于 Windows,请参阅 this recipe

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

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

关于c++ - 在运行时确定 *.dll 或 *.so 的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27886269/

相关文章:

c++ - 如何在 Linux 中为 Qt 应用程序制作控制台 cmd?

c++ - 为什么编译器测试地址中的最低有效位?

c++ - 为什么 std::function 在这种情况下不起作用?

c++ - c2797 成员初始化器列表或非静态数据成员初始化器中的列表初始化未实现

c++ - 使用 UTF-8 时带有奇怪字符的 SFML 标题栏

c# - 如何在 C# 中将数据从指针复制到指针?

c++ - 如何在跟踪原始索引的同时压缩 vector (具有重复项)?

c++ - 如果我为多个编写器使用额外的互斥锁,我可以在 SQLite3 中使用 WAL 模式吗?

c++ - 我如何创建结构的结构等。嵌套多个结构?

c++ - 在 C++ Rcpp 中实现 R 函数