共享对象和动态链接库(DLL)之间的区别
在Linux操作系统中,静态库(.a,也称为存档文件)用于在编译时进行链接,而共享对象(.so)用于在加载时和运行时进行链接。
在你的情况下,似乎由于某种原因,库在加载时(libEXAMPLE.so)和运行时(EXAMPLE.so)对文件进行了不同的链接,尽管这两个文件完全相同。
为了解决这个问题,可以尝试以下方法之一:
1. 重新编译库文件:使用正确的编译选项重新编译库文件,确保在加载和运行时都使用相同的文件进行链接。
2. 创建软链接:可以尝试创建一个指向正确文件的软链接,以便在加载和运行时都使用同一个文件进行链接。可以使用以下命令创建软链接:
ln -s libEXAMPLE.so EXAMPLE.so
3. 检查库文件的符号链接:使用以下命令检查库文件的符号链接是否正确:
readelf -d libEXAMPLE.so | grep NEEDED
确保所需的符号链接正确指向相同的文件。
通过采取上述解决方法之一,你应该能够解决在加载和运行时链接相同文件的问题。
在使用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文件夹中看到了结果。