相当于Linux中的导入库

Dra*_*gno 2 c++ linux windows gnu

在Windows C ++中,当您要链接到DLL时,必须提供一个导入库。但是在GNU构建系统中,当您想链接.so文件时,就相当于您不希望使用的dll。为什么是这样?是否有等效的Windows导入库。

注意:我并不是说要在Windows中使用GNU C ++的情况,在这种情况下还必须使用导入库。分割线是在Windows C ++和Linux C ++之间。

Bas*_*tch 6

Windows和Linux中的链接模型不同。阅读Levine的书《链接器和加载器》(在Linux上,库的每个公共符号都将导出,除非您玩了一些可视性技巧;在Windows上则不是,并且需要明确显示导出的符号)。

C ++ 11标准(读n3337)没有提到动态链接。这是一个实现细节。

未来的C ++ 20可能会有modules

Linux中没有“导入库”。

有关更多详细信息,请注意名称修饰是不同的。另请参阅程序库Howto,Drepper的如何编写共享库

在Linux上,插件动态加载程序加载(与Windows上的处理方式不同)。参见ld-linux(8)dlopen(3)dlsym(3)elf(5)

在Linux上检查是否 具有objdump(1)以及readelf(1)nm(1)的ELF文件(目标文件可执行文件

另请参见C ++ dlopen mini howto。另请参阅“ 可见性”功能属性。另请参阅问题。

.so文件相当于dll

Linux 共享库ELF .so文件)与Windows DLL 不完全等效。阅读上面给出的参考。

我还建议您阅读《操作系统:三篇简单的文章》和旧的《高级Linux编程》(均可免费下载)。稍后阅读syscalls(2)和从那里引用的页面。

另请注意,Linux是免费软件,因此您可以下载和研究其大多数组件的源代码。

PS。Linux和Windows确实不同。不要期望在Linux中找到与每个Windows功能完全相同的功能。睁大眼睛看看Linux。充分利用Linux是由自由软件,并考虑研究源代码,如中binutils的,GNU libc中MUSL-libc的(包括提供一些ld-linux.solibc.so,因此C标准库),GCC(均提供C ++上方的标准库libc.so)。


yug*_*ugr 5

为了补充 Basile 的答案,您可能偶尔需要在 Linux 上导入库来模拟共享库的延迟加载(例如,如果您的应用程序很少需要此库并且您不想在其上浪费资源,这很有用)。

这种模拟导入库将由一堆包装器组成,这些包装器在内部调用dlopendlsym,然后转到共享库中的实现。它们可以通过项目特定的脚本或通用工具Implib.so手动实现。