相关疑难解决方法(0)

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

我正试图在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(或其他)?

c dll shared-libraries static-libraries

50
推荐指数
1
解决办法
8046
查看次数

为什么有些DLL文件需要额外的.lib文件才能进行链接?

我有关于库链接和.lib文件的问题...

这是背景:

  • OS = Windows
  • IDE = QT

我创建了一个DLL:MyLib.dll.
要在我的QT项目中使用该库,我只需要包含一个包含路径,一个指向库的链接并使用头文件:

LIBS += "C:\myPath\MyLib.dll"
INCLUDEPATH += "C:\myPath"
HEADERS += \
    ../myPath/MyLib_global.h \
    ../myPath/mylib.h
Run Code Online (Sandbox Code Playgroud)

我在我的项目中使用第三方DLL:third.dll
如果我执行与上面示例相同的操作,则它不起作用:

LIBS += "C:\myPath\third.dll" 
Run Code Online (Sandbox Code Playgroud)

第三方DLL附带.lib文件"third.lib",我显然需要与DLL一起使用.

这是为什么?为什么有些DLL库需要.lib文件,但其他DLL库却不需要?
可能是.lib是一个访问DLL的静态库吗?

非常感谢!

dll qt shared-libraries dynamic-linking static-libraries

16
推荐指数
2
解决办法
4785
查看次数

Delphi链接器和C++链接器之间的区别

我来自Delphi世界,静态导入DLL函数非常简单.您需要做的就是指定函数名称和模块,如下所示:

function GetTickCount : DWORD; stdcall; external 'Kernel32.dll';
Run Code Online (Sandbox Code Playgroud)

为什么在C++中必须使用kernel32.lib才能导入函数?为什么我不能简单地告诉链接器像Delphi一样导入该函数?

我知道这对你们的manny来说听起来很无聊,但是从Delphi进入C++世界真的会让人感到困惑.

c++ delphi static-linking

4
推荐指数
1
解决办法
646
查看次数