使用Visual Studio 10 C ++,我遇到了奇怪的链接错误。由于某种原因,对全局对象的引用不会链接到该全局对象。它告诉我一个符号未定义但当我查看.cod文件时,符号就在那里,就像白天一样。
错误:
FTShell.lib(ftcommodule.obj) : error LNK2001: unresolved external symbol
"class CFTModuleShellBase * _pFTModule" (?_pFTModule@@3PAVCFTModuleShellBase@@A)
但是主cpp文件的.cod文件显示了全局符号的声明和分配:
PUBLIC ?_pFTModule@@3PAVCFTModuleShellBase@@A ; _pFTModule
_DATA SEGMENT
?_pFTModule@@3PAVCFTModuleShellBase@@A DD FLAT:?_Module@@3VCFTComModule@@A ; _pFTModule
ORG $+4
那么为什么静态库的_pFTModule不匹配源文件中的全局符号?
编辑:我从命令行运行msbuild:
Link:
C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\link.exe
/ERRORREPORT:QUEUE.... "C:\(path)\FTTrace.res"
"C:\(path)\FTTrace.obj"
我注意到最后只有一个.obj文件。项目中有两个.cpp文件。 MSBUILD确实构建了这两个文件。那么为什么它不将两个文件都传递给链接器。 .vcxproj文件不会以不同方式处理.cpp文件。为什么MSBUILD不会在链接步骤中包含这两个文件?
<ItemGroup>
<ClCompile Include="FTTrace.cpp" />
<ClCompile Include="TraceImpl.cpp" />
</ItemGroup>
答案 0 :(得分:0)
奇怪的是,错误是将ImpLib属性设置为错误值的结果。财产表说:<ImpLib>$(OneOfMyPathVars)\%(Filename).lib</Implib>
。由于%(Filename)在链接阶段为空,因此“C:\ foo.lib”不会导致创建ImpLib。这导致了项目中声明的函数未解析的外部因素。可能是链接器中的一个错误,但它是自己造成的。