我想在我的项目中使用一些dll(VS2013-c),
我使用“project-> properties-> vc目录”给出了dll和header的路径,并且在构建项目之后,出现了链接器错误(常见的“未解析的外部符号”) . 通过将.lib文件提供给链接器可以解决问题!
但为什么静态库(.lib)需要动态链接???
它是一个导入库,其中包含导出的定义,它位于 DLL 内,并且名称为 DLL (*) .
DLL
您可以将LIB与/ DEF选项一起使用来创建导入库和导出文件 . LINK使用导出文件来构建包含导出的程序(通常是动态链接库(DLL)),并使用导入库来解析对其他程序中这些导出的引用 .
并且:
在大多数情况下,您无需使用LIB来创建导入库 . 链接包含导出的程序(可执行文件或DLL)时,LINK会自动创建一个描述导出的导入库 . 稍后,当您链接引用这些导出的程序时,您可以指定导入库 .
动态库在运行时加载(在应用程序启动时) - 链接器不检查某些特定符号在 DLL 中的位置 . Header 说 __dllimport - "this symbol is an extern, it should be imported from somewhere" . Lib 说“我知道这个符号在哪里 - 它位于 XXX.dll ,所以在启动后查看” .
Header
__dllimport
Lib
XXX.dll
(*) 我看到很多人,他们试图改变 .lib 和相应的 .dll 的名字,并期望它会起作用 . .lib 的内容是它没有的原因 .
.lib
.dll
告诉它DLL的名称及其中的内容,以及输入的pioint数字(如果使用的话),以及
将二进制接口(.lib)与其实现(DLL)隔离开来 . 例如,Winsock有一个标准的.lib文件,它独立于当天的实际多供应商实现 .
2 回答
它是一个导入库,其中包含导出的定义,它位于
DLL
内,并且名称为DLL
(*) .并且:
动态库在运行时加载(在应用程序启动时) - 链接器不检查某些特定符号在
DLL
中的位置 .Header
说__dllimport
- "this symbol is an extern, it should be imported from somewhere" .Lib
说“我知道这个符号在哪里 - 它位于XXX.dll
,所以在启动后查看” .(*) 我看到很多人,他们试图改变
.lib
和相应的.dll
的名字,并期望它会起作用 ..lib
的内容是它没有的原因 .告诉它DLL的名称及其中的内容,以及输入的pioint数字(如果使用的话),以及
将二进制接口(.lib)与其实现(DLL)隔离开来 . 例如,Winsock有一个标准的.lib文件,它独立于当天的实际多供应商实现 .