相当于Linux中的导入库

时间:2018-12-09 10:18:17

标签: c++ linux windows gnu

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

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

2 个答案:

答案 0 :(得分:4)

在Windows和Linux中,链接模型是不同的。阅读Levine的书Linkers and loaders(在Linux上,除非您使用symbol技巧,否则library的每个公共visibility都会被导出;在Windows上则不是,然后导出符号需要明确显示。)

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

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

Linux中没有“导入库”。

有关更多详细信息,请注意name mangling是不同的。另请参阅Program Library Howto,Drepper的How to Write Shared Libraries

在Linux上,pluginsdynamic loader加载{{3}与Windows相比 处理不同。参见ld-linux(8)dlopen(3)dlsym(3)elf(5)

在Linux上使用ELFobject files和{{3}检查libraries文件(executablesobjdump(1)readelf(1)) }。

另请参见nm(1)。另请参阅有关C++ dlopen mini howto函数Visibility的信息。另请参阅attribute问题。

  

.so文件,相当于dll

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

我还建议您阅读DLL和旧的Operating Systems: Three Easy Pieces(均可免费下载)。稍后阅读Advanced Linux Programming和从那里引用的页面。

还要注意,Linux是syscalls(2),因此您可以下载和研究其大多数组件的源代码。

PS。 Linux和Windows确实不同。不要期望在Linux中找到与每个Windows功能完全相同的功能。 以崭新的眼光看Linux。利用Linux由自由软件组成的优势,并考虑研究源代码,例如free softwarekernel,GNU binutilslibc中的一个(都提供一些ld-linux.solibc.so,所以一个musl-libc) ,C standard libraryGCC(都在libc.so上方提供Clang)。

答案 1 :(得分:3)

要添加到Basile的答案中,您有时可能需要在Linux上使用导入库来模拟共享库的delay loading(这很有用,例如,如果您的应用程序很少需要该库,并且您不想浪费资源, )。

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