在运行时确定 *.dll 或 *.so 的路径
Determine the path of a *.dll or *.so at runtime
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/
这真的很容易使用。
相关文章:
- 如何使用ndk-build.cmd构建Android.so文件
- 如何将更多文件夹添加到c++include路径
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- C++A*算法并不总是在路径中具有目标节点
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- 从函数角度看ID到文件路径的内部与外部映射
- boost xml parsingl将xml的路径作为变量发送
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 如何使用cppcheck处理半相对包含路径
- 在C++中设置基于操作系统的文件路径
- 基于编译器选项的编译二进制路径
- 按边长度递归搜索图中所有可行路径
- 使用变量值作为 PlaySound 中的路径
- CLANG格式在缺少libtinfo.so.5库中不起作用
- 如何将路径传递到 libjvm.so 到巴泽尔构建?
- 如何更改路径以修复错误"./main:加载共享库 libmkl_core.so 时出错?
- 在运行时确定 *.dll 或 *.so 的路径
- G++ libc.so 绝对路径交叉编译错误
- 对于不遵循libNAME.so命名约定的库,如何使用不带-l或硬编码路径的GCC进行链接