为什么LIB文件具有如此双重性质的野兽?

Lum*_*umi 50 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
Run Code Online (Sandbox Code Playgroud)

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

一些包含目标文件,它们是静态库.其他包含符号,它们是导入库.(这里有一个简短的解释.)

因此,静态库似乎是.aLinux 上文件的等价物,而DLL似乎映射到.soLinux 上的文件.(顺便说一下,导入库如何适应这个Windows/Linux等效图片?)

现在我想知道为什么会这样?为什么Microsoft决定为导入库提供与静态库相同的文件扩展名?(我理解,从历史上看,静态图书馆是第一位的,就像原始形式的生活先于更复杂的形式.)为什么他们不会说,好吧,这些是新的图书馆,他们应该被称为进口图书馆,他们应该承担文件扩展名.ILB(或其他)?

Bli*_*ndy 9

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

  • 谢谢 - 我懂了!导入库是普通的库,这就是静态链接的库,只包含动态加载DLL中实际代码的代码.这也在[cl.exe/MD`选项的MSDN文档]中进行了简要说明(http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx). (15认同)
  • 这就是我所说的静态和导入库.导入库不是什么神奇的东西,当然不是"代码指针",它们包含调用`LoadLibrary`和`GetProcAddress`的普通代码来为你加载函数指针. (11认同)
  • 嗯,但DLL也是库,它们并没有阻碍MS赋予它们专用的`.dll`扩展名.但是,我听到你说,他们是不同的野兽.那么,那么关于**静态**库(包含代码)和**import**库(包含指向代码的指针)呢?他们有什么相似之处,给他们起了同样的名字是切实可行的?当Linux不需要任何代码时,为什么需要导入库来绑定DLL?也许这些问题看起来很愚蠢,当你已经知道这些东西多年,但如果你是新手,我认为你有理由怀疑. (8认同)