在Windows C ++中,当您要链接到DLL时,必须提供一个导入库。但是在GNU构建系统中,当您想链接.so文件时,就相当于您不希望使用的dll。为什么是这样?是否有等效的Windows导入库。
注意:我不是说要在Windows中使用GNU C ++的情况,在这种情况下还必须使用导入库。分隔线在Windows C ++和Linux C ++之间。
答案 0 :(得分:4)
在Windows和Linux中,链接模型是不同的。阅读Levine的书Linkers and loaders(在Linux上,除非您使用symbol技巧,否则library的每个公共visibility都会被导出;在Windows上则不是,然后导出符号需要明确显示。)
C++11标准(阅读n3337)没有提到动态链接。这是一个实现细节。
有关更多详细信息,请注意name mangling是不同的。另请参阅Program Library Howto,Drepper的How to Write Shared Libraries
在Linux上,plugins由dynamic loader加载{{3}与Windows相比 处理不同。参见ld-linux(8),dlopen(3),dlsym(3),elf(5)
在Linux上使用ELF和object files和{{3}检查libraries文件(executables,objdump(1),readelf(1)) }。
另请参见nm(1)。另请参阅有关C++ dlopen mini howto函数Visibility的信息。另请参阅attribute问题。
.so文件,相当于dll
Linux this(shared object .so
文件)与Windows ELF 不完全等效。阅读上面给出的参考。
我还建议您阅读DLL和旧的Operating Systems: Three Easy Pieces(均可免费下载)。稍后阅读Advanced Linux Programming和从那里引用的页面。
还要注意,Linux是syscalls(2),因此您可以下载和研究其大多数组件的源代码。
PS。 Linux和Windows确实不同。不要期望在Linux中找到与每个Windows功能完全相同的功能。 以崭新的眼光看Linux。利用Linux由自由软件组成的优势,并考虑研究源代码,例如free software,kernel,GNU binutils或libc中的一个(都提供一些ld-linux.so
和libc.so
,所以一个musl-libc) ,C standard library或GCC(都在libc.so
上方提供Clang)。
答案 1 :(得分:3)
要添加到Basile的答案中,您有时可能需要在Linux上使用导入库来模拟共享库的delay loading(这很有用,例如,如果您的应用程序很少需要该库,并且您不想浪费资源, )。
这种模拟的导入库由一堆包装程序组成,这些包装程序在内部调用dlopen
和dlsym
,然后转到共享库中的实现。可以通过特定于项目的脚本或通过通用工具Implib.so手动实现它们。