c++ - 错误 LNK2001 : unresolved external symbol for static lib that is loaded

标签 c++ visual-studio-2010 static-libraries linker-errors

所以我已经坚持了将近一个月了。我有一个 MSVC++ 项目,在正确的目录中有一个库,并且 Diagnostic build verbosity on。 .LIB 是静态编译并运行的:

dumpbin/headers GazeApiLib.lib

返回,除此之外:

     Code
     COMDAT; sym= "public: bool __cdecl gtl::GazeApi::connect(bool)" (?connect@GazeApi@gtl@@QEAA_N_N@Z)
     16 byte align
     Execute Read

但是详细构建失败并出现以下错误:

1>  C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\Tracker.exe /a /d C:\Windows\Microsoft.NET\Framework\v4.0.30319\FileTracker.dll /i "C:\Users\Snail\Documents\Visual Studio 2010\Projects\EyeTracker2\EyeTracker2\Release" /r "C:\USERS\SNAIL\DOCUMENTS\VISUAL STUDIO 2010\PROJECTS\EYETRACKER2\EYETRACKER2\GAZEAPILIB.LIB|C:\USERS\SNAIL\DOCUMENTS\VISUAL STUDIO 2010\PROJECTS\EYETRACKER2\EYETRACKER2\RELEASE\MAIN.OBJ" /b MSBuildConsole_CancelEventc512b4a37e0c4c399b5a3a0500474f44  /c "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\link.exe"  /ERRORREPORT:PROMPT /OUT:"C:\Users\Snail\Documents\Visual Studio 2010\Projects\EyeTracker2\Release\EyeTracker2.exe" /NOLOGO /LIBPATH:"C:\Users\Snail\Documents\Visual Studio 2010\Projects\EyeTracker2\EyeTracker2\libs" GazeApiLib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /ManifestFile:"Release\EyeTracker2.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\Users\Snail\Documents\Visual Studio 2010\Projects\EyeTracker2\Release\EyeTracker2.pdb" /OPT:REF /OPT:ICF /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:\Users\Snail\Documents\Visual Studio 2010\Projects\EyeTracker2\Release\EyeTracker2.lib" /MACHINE:X86 Release\main.obj
1>  GazeApiLib.lib (TaskId:27)
1>main.obj : error LNK2001: unresolved external symbol "public: bool __thiscall gtl::GazeApi::connect(bool)" (?connect@GazeApi@gtl@@QAE_N_N@Z)

在头文件中手动将其标记为 __cdecl 会出现此错误:

1>main.obj:错误 LNK2001:未解析的外部符号“public:bool __cdecl gtl::GazeApi::connect(bool)”(?connect@GazeApi@gtl@@QAA_N_N@Z)

因此,一方面看起来它成功地包含了 lib 文件,但它似乎无法找到函数,即使原型(prototype)完全匹配。怎么回事?

编辑:更多信息,我运行了 undname 并发现 LIB 文件中未损坏的名称是:

public: bool __cdecl gtl::GazeApi::connect(bool) __ptr64

这与我的代码签名略有不同,这可以解释为什么损坏的名称不匹配(?connect@GazeApi@gtl@@QAE_N_N@Z 与?connect@GazeApi@gtl@@QAA_N_N@Z)

最佳答案

我很确定这两个汇编之间存在字数差异。您的库使用 64 位大小的指针,而您的项目编译为使用 32 位大小的指针。请注意 lib 中函数的错位名称中的 E,这意味着 __ptr64 (?connect@GazeApi@gtl@@QEAA_N_N@Z)。 这给出了对应于 lib 中的函数的声明是

BOOL __cdecl gtl::GazeApi::connect(BOOL) __ptr64

希望对你有帮助

编辑: 以后遇到类似问题:http://demangler.com/

关于c++ - 错误 LNK2001 : unresolved external symbol for static lib that is loaded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26337797/

相关文章:

c++ - 链接后的最小可执行文件大小

c# - 如何找出到底是什么导致了 NullReferenceException

c++ - 错误 C4430 - 对象 - 类

c++ - Visual Studio 2010 的 dword ptr [...] 问题

c++ - MacOS 上的 Qbs 静态库

linker - w64-Mingw LLVMSupport.a : undefined reference to __imp_*

c++ - 为什么我的 operator=(&&) 模板只绑定(bind)到 const 而不是 &&?

c++ - 如何同时使用组合和继承?

c++ - 构造函数基本(对距离的引用是模棱两可的)

c++ - Release模式下异常, Debug模式下不异常