c - 为什么 LIB 文件是具有这种口是心非性质的野兽?

标签 c dll shared-libraries static-libraries

我试图了解 Microsoft Windows 上的 LIB 文件业务,我刚刚有了一个发现——我希望——消除迄今为止阻碍我清楚地了解这个问题的困惑。也就是说,LIB 文件并不是其文件扩展名表明的那种文件。

:: cd "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib"

:: lib /nologo /list Ad1.Lib
obj\i386\activdbgid.obj
obj\i386\activscpid.obj
obj\i386\ad1exid.obj
obj\i386\dbgpropid.obj
obj\i386\dispexid.obj

:: lib /nologo /list oledb.lib
o:\winmain.obj.x86fre\enduser\…\oledb\uuid\objfre\i386\oledbiid.obj
o:\winmain.obj.x86fre\enduser\…\oledb\uuid\objfre\i386\oledbnewiid.obj
o:\winmain.obj.x86fre\enduser\…\oledb\uuid\objfre\i386\cmdtreeiid.obj
o:\winmain.obj.x86fre\enduser\…\oledb\uuid\objfre\i386\oledbdepiid.obj

:: lib /nologo /list AdvAPI32.Lib | sort | uniq -c
    731 ADVAPI32.dll

前两个示例包含目标文件(在 lib.exe 实用程序显示时显示为相对或绝对路径)。然而,第三个示例仅包含 731 个对 DLL 的引用。 (我想 lib.exe 并不是为了显示此类文件的更多有用信息而设计的。)

有些包含目标文件,它们是静态库。其他包含符号,它们是导入库。 (有一个 short explanation here 。)

因此静态库在 Linux 上似乎等同于 .a 文件,而 DLL 在 Linux 上似乎映射到 .so 文件。 (顺便说一句,导入库如何适应这张 Windows/Linux 等效图片?)

现在我想知道为什么会这样?为什么 Microsoft 决定为导入库提供与静态库相同的文件扩展名? (我知道从历史上看,静态库是第一个,就像原始生命形式先于更复杂的形式一样。)他们为什么不说,好吧,这是这些新类型的库,它们应该被称为导入库,它们应该带有文件扩展名 .ILB(或其他)?

最佳答案

因为它们图书馆。为什么要发明一个全新的特定于供应商的扩展,用于与他们已经特定于供应商的库完全相同的东西?

关于c - 为什么 LIB 文件是具有这种口是心非性质的野兽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6421693/

相关文章:

c - 如何使 objdump -D 在 Windows 中只显示特定功能?

c - 在 3d 空间中找到有效率的最近邻居

c - 使用 dm-crypt 在映射的加密设备上同步?

c# - native C++ dll/C#内存问题

WPF。将DLL嵌入到EXE中

C++ 自定义全局新建/删除覆盖系统库

c++ - 如何找到机器上为 C 或 CPP 安装/可用的库?

linux - 共享库中的 undefined symbol

c - scanf 在 C 中导致无限循环

dll - pinvoke 字符串中仅传递第一个字符