所以我已经坚持了近一个月了。我有一个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 : error LNK2001: unresolved external symbol "public: bool __cdecl gtl::GazeApi::connect(bool)" (?connect@GazeApi@gtl@@QAA_N_N@Z)
所以一方面看起来它成功地包含了lib文件,但即使原型完全匹配,它似乎也找不到功能。发生了什么事?
编辑:更多信息,我运行了无名称,发现LIB文件中的未编号名称是:
public: bool __cdecl gtl::GazeApi::connect(bool) __ptr64
与我的代码签名略有不同,这可以解释为什么被破坏的名称不匹配(?connect @ GazeApi @ gtl @@ QAE_N_N @ Z vs.?connect @ GazeApi @ gtl @@ QAA_N_N @ Z)
答案 0 :(得分:1)
我很确定这两个编辑之间的字面差异。您的lib使用64位大小的指针,而您的项目编译为使用32位大小。注意lib中函数的错位名称中的E,即__ptr64(?connect @ GazeApi @ gtl @@ Q E AA_N_N @ Z)。 这给出了与lib中的函数相对应的函数的声明是
BOOL __cdecl gtl::GazeApi::connect(BOOL) __ptr64
我希望这会有所帮助
修改强> 对于将来的类似问题:http://demangler.com/