【发布时间】:2013-07-01 04:24:34
【问题描述】:
好吧,我基本上继承了一堆我被告知要修复的代码,因为它在几个月前曾经可以工作,但现在不行。该程序本身似乎充满了链接错误,我能够修复其中的一些错误。但是,我遇到了 LNK2019 未解决的外部 _imp 错误,其中主要使用的某些功能未解决。由于“_imp”,我假设这是与从 .dll 或 .lib 文件导入有关的问题。
首先,我有三个 .lib 文件,我相信它们可以正确地导入 VS2010,并且我已将平台配置为 64x。还有与 .lib 文件对应的 .dll 文件。包含这些错误函数声明的 .h 文件包含类似
的内容ILAPI void ILAPIENTRY ilDeleteImage(const ILuint Num);
不幸的是,我猜测该定义是在我自己没有编写的 .dll 文件中定义的,所以我不确定。但由于这是在我相信我收到此错误之前有效的代码,因为链接器找不到定义而不是 def/decl 不匹配的原因。
当我将鼠标悬停在 ILAPI 上时,它会显示:“ILAPI __declspec(dllimport)” 我目前的猜测是程序导入 .lib 文件,而 .lib 文件使用 .dll 文件来获取函数的定义。我相信我正在导入 .lib 文件,因为编译器不再继续告诉我它找不到特定的 .lib 文件。但是我担心它可能没有连接 .dll 文件。我有些不确定。我已经打开了 .lib 文件,并且 .lib 文件包含给出错误的函数的名称。我还使用了dependency walker程序来查看我的DLL文件,它给了我以下一些错误:
错误:由于隐式依赖模块中缺少导出函数,至少有一个模块存在未解析的导入。
错误:发现具有不同 CPU 类型的模块。
基于其他人的 cmets,我觉得我可以忽略第二个错误。但我不确定第一个错误。我也不确定这是否是问题的根本原因。它可能是也可能不是。
我还使用 VS cmd 和依赖项遍历器查看了 .lib 文件,似乎无法找到的函数的名称列在 .lib 和 .dll 之一中。
在配置方面,我在发布模式 x64 平台上运行。 我在 proj -> prop -> 链接器 -> 命令行中添加了“DevIL.lib ILU.lib ILUT.lib”库函数。我还添加了链接器的路径 -> 常规 -> 附加库目录。我也尝试过弄乱输入附加依赖项,但它没有效果。 .lib 和 .dll 文件也放在同一目录中。在 proj 属性配置中,我没有在任何地方提及 .dll(我应该这样做吗?我在不同的位置尝试过,但只会产生更多错误)我知道有很多关于链接 2019 错误的帖子,但我没有很好到目前为止,我在寻找我的特定问题时很幸运。如果有任何建议、评论或链接,我将不胜感激,我可以在其中找到有关为什么会发生这种情况的线索
这是来自日志的链接器命令:
这是来自构建日志本身的链接器命令:
链接: C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64\link.exe /ERRORREPORT:PROMPT /OUT:"x64\Release\dff.exe" /VERBOSE /INCREMENTAL /NOLOGO /LIBPATH:C:\Users\Sub2\Desktop\dff\x64\Release /MANIFEST /ManifestFile:"x64\Release\dff.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\Users\Sub2\Desktop\dff\x64\Release\dff.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"x64\Release\dff.lib" /MACHINE:X64 x64\Release\dff.exe.embed.manifest.res x64\Release\acquisition.obj x64\发布\azmemutil.obj x64\发布\dff.obj x64\发布\fft.obj x64\Release\FocusMeasure.obj x64\发布\ge.obj x64\Release\stdafx.obj DevIL.lib ILU.lib ILUT.lib 1>链接:警告 LNK4075:由于“/OPT:ICF”规范而忽略“/INCREMENTAL”
// This is from Win32's <wingdi.h> and <winnt.h>
#if defined(__LCC__)
#define ILAPI __stdcall
#elif defined(_WIN32) //changed 20031221 to fix bug 840421
#ifdef IL_STATIC_LIB
#define ILAPI
#else
#ifdef _IL_BUILD_LIBRARY
#define ILAPI __declspec(dllexport)
#else
#define ILAPI __declspec(dllimport)
#endif
#endif
#elif __APPLE__
#define ILAPI extern
#else
#define ILAPI
#endif
还有:
#define ILAPIENTRY __stdcall
在接近错误时构建日志信息:
Found KERNEL32_NULL_THUNK_DATA
Referenced in kernel32.lib(KERNEL32.dll)
Loaded kernel32.lib(KERNEL32.dll)
Searching C:\Users\Sub2\Desktop\dff\x64\Release\DevIL.lib:
Searching C:\Users\Sub2\Desktop\dff\x64\Release\ILU.lib:
Searching C:\Users\Sub2\Desktop\dff\x64\Release\ILUT.lib:
Searching C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64\MSVCRT.lib:
Searching C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64\OLDNAMES.lib:
Searching C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64\msvcprt.lib:
Finished searching libraries
Finished pass 1
Invoking CVTRES.EXE:
/machine:amd64
/verbose
/out:"C:\Users\Sub2\AppData\Local\Temp\lnk92ED.tmp"
/readonly
"x64\Release\dff.exe.embed.manifest.res"
Microsoft (R) Windows Resource To Object Converter Version 10.00.30319.01
Copyright (C) Microsoft Corporation. All rights reserved.
adding resource. type:MANIFEST, name:1, language:0x0409, flags:0x30, size:2
1>dff.obj : error LNK2019: unresolved external symbol __imp_iluGetImageInfo referenced in function main
1>dff.obj : error LNK2019: unresolved external symbol __imp_iluImageParameter referenced in function main
1>dff.obj : error LNK2019: unresolved external symbol __imp_ilDeleteImages referenced in function main
1>dff.obj : error LNK2019: unresolved external symbol __imp_ilSaveImage referenced in function main
1>dff.obj : error LNK2019: unresolved external symbol __imp_iluFlipImage referenced in function main
1>dff.obj : error LNK2019: unresolved external symbol __imp_iluScale referenced in function main
1>dff.obj : error LNK2019: unresolved external symbol __imp_ilTexImage referenced in function main
1>dff.obj : error LNK2019: unresolved external symbol __imp_ilCopyPixels referenced in function main
1>dff.obj : error LNK2019: unresolved external symbol __imp_ilGetError referenced in function main
1>dff.obj : error LNK2019: unresolved external symbol __imp_ilLoadImage referenced in function main
1>dff.obj : error LNK2019: unresolved external symbol __imp_ilBindImage referenced in function main
1>dff.obj : error LNK2019: unresolved external symbol __imp_ilGenImages referenced in function main
1>dff.obj : error LNK2019: unresolved external symbol __imp_ilInit referenced in function main
1>dff.obj : error LNK2019: unresolved external symbol __imp_ilGetInteger referenced in function main
1>dff.obj : error LNK2019: unresolved external symbol __imp_ilEnable referenced in function main
1>dff.obj : error LNK2019: unresolved external symbol __imp_ilOriginFunc referenced in function main
1>x64\Release\dff.exe : fatal error LNK1120: 16 unresolved externals
1>Done Building Project "C:\Users\Sub2\Desktop\dff\dff.vcxproj" (rebuild target(s)) -- FAILED.
构建失败。
以防万一我也尝试过编写#define _IL_BUILD_LIBRARY 但没有效果。
【问题讨论】:
-
您可以添加用于执行链接的完整链接器命令吗?您应该在某个地方的构建日志中找到它。
-
哦,您还可以添加
ilDeleteImage的预处理形式对于发出呼叫的源的样子吗? -
这是我从属性中提取的链接器命令行: /OUT:"x64\Release\dff.exe" /VERBOSE /INCREMENTAL /NOLOGO /LIBPATH:"C:\Users\Sub2\Desktop \dff\x64\Release" /MANIFEST /ManifestFile:"x64\Release\dff.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C: \Users\Sub2\Desktop\dff\x64\Release\dff.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /PGD:"C:\Users\Sub2\Desktop\dff\x64\Release\dff. pgd" /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X64 /ERRORREPORT:QUEUE
-
好吧,我相信 ilDeleteImage 是在 DLL/.lib 中定义的,所以如果这就是您的要求,我看不到它的实际定义。对不起,我对这个 dll 的东西有些陌生
-
我通过编辑提供了有关何时将 ILAPI 定义为 declspec(dllimport) 的更多信息
标签: c++ dll unsatisfiedlinkerror