共享对象和动态链接库(DLL)之间的区别

12 浏览
0 Comments

共享对象和动态链接库(DLL)之间的区别

我有一个库,在编译时会生成一个名为libEXAMPLE.so的共享对象(在so.le文件夹中),以及一个名为EXAMPLE.so的dll(在dll文件夹中)。这两个共享对象在大小上非常相似,看起来是完全相同的东西。搜索互联网发现,程序使用dll进行符号解析的方式可能与使用共享对象的方式有所不同。你们能帮助我理解这个吗?

0
0 Comments

在Linux操作系统中,静态库(.a,也称为存档文件)用于在编译时进行链接,而共享对象(.so)用于在加载时和运行时进行链接。

在你的情况下,似乎由于某种原因,库在加载时(libEXAMPLE.so)和运行时(EXAMPLE.so)对文件进行了不同的链接,尽管这两个文件完全相同。

为了解决这个问题,可以尝试以下方法之一:

1. 重新编译库文件:使用正确的编译选项重新编译库文件,确保在加载和运行时都使用相同的文件进行链接。

2. 创建软链接:可以尝试创建一个指向正确文件的软链接,以便在加载和运行时都使用同一个文件进行链接。可以使用以下命令创建软链接:

ln -s libEXAMPLE.so EXAMPLE.so

3. 检查库文件的符号链接:使用以下命令检查库文件的符号链接是否正确:

readelf -d libEXAMPLE.so | grep NEEDED

确保所需的符号链接正确指向相同的文件。

通过采取上述解决方法之一,你应该能够解决在加载和运行时链接相同文件的问题。

0
0 Comments

在使用QNX来针对多个平台(如ARM)时,我在(so文件夹)中得到了一个libLIBRARY-NAME.so文件和一个LIBRARY-NAME.so文件(在dll文件夹中)。这两者有什么区别?你在哪个主机系统上编译?在Linux/Unix环境中,编译器不太可能产生.dll文件,除非你是在进行交叉编译。也许这只是库构建系统的一个缺陷,你在dll文件夹中看到了结果。

问题的原因是在使用QNX来针对多个平台(如ARM)时,用户在(so文件夹)中得到了一个libLIBRARY-NAME.so文件和一个LIBRARY-NAME.so文件(在dll文件夹中),并且想知道这两者之间的区别。

解决方法是询问用户在哪个主机系统上进行编译,并指出在Linux/Unix环境中,编译器不太可能产生.dll文件,除非进行交叉编译。同时,提醒用户可能只是库构建系统的一个缺陷,导致在dll文件夹中看到了结果。

0