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/