在Linux中,导入库的等效方式

6 浏览
0 Comments

在Linux中,导入库的等效方式

在Windows的C++中,当你想要链接到一个DLL时,你必须提供一个导入库。但是在GNU构建系统中,当你想要链接到等效的.dll文件时,你不需要。为什么会这样?是否有Windows导入库的等效物?

注意:我不是在讨论在Windows中使用GNU C++的情况,那种情况下你也必须使用导入库。这条分界线是在Windows C++和Linux C++之间。

0
0 Comments

在Linux中,有时候需要使用import libraries来模拟延迟加载共享库的功能。这在应用程序很少需要该库且不想浪费资源的情况下非常有用。

这种模拟的import libraries由一系列的包装器组成,这些包装器会在内部调用dlopen和dlsym,然后跳转到共享库中的实现。可以通过手动实现、项目特定的脚本或者通用工具Implib.so来实现这些模拟的import libraries。

以上是问题的原因和解决方法。

0
0 Comments

在Linux中没有"import libraries"的概念。这是因为Windows和Linux中的链接模型不同。在Linux中,每个库的公共符号都是被导出的,除非你使用可见性技巧;而在Windows中,情况并非如此,需要显式地导出符号。

C++11标准没有提到动态链接,这是一个实现细节。未来的C++20可能会引入模块的概念。

在Linux中,插件(plugins)由动态加载器(dynamic loader)加载和处理,与Windows上的处理方式有所不同。可以使用ld-linux、dlopen、dlsym和elf等工具来检查Linux上的ELF文件(目标文件、库文件、可执行文件)。此外,Linux是自由软件,可以下载和研究大部分组件的源代码。

Linux和Windows是非常不同的。不要期望在Linux中找到每个Windows功能的精确等价物。要以全新的眼光看待Linux,并充分利用Linux是自由软件的特点,考虑研究内核、binutils、GNU libc或musl-libc、GCC或Clang等组件的源代码。

关于问题中提到的导出符号需要显式声明的问题,可以使用__declspec(dllexport)来实现。在Windows中,DLL没有任何导出符号,如果单独链接对其进行链接是无用的,这就是为什么需要导入.lib文件的原因。

总之,Linux和Windows的链接模型不同,导致在Linux中没有"import libraries"的概念。要在Linux中加载和处理插件,需要使用动态加载器,并通过ELF文件来检查和分析。

0