链接对象中奇怪的未解决的外部错误

时间:2010-06-25 15:20:49

标签: c++ visual-studio-2010 linker-errors unresolved-external

使用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>

1 个答案:

答案 0 :(得分:0)

奇怪的是,错误是将ImpLib属性设置为错误值的结果。财产表说:<ImpLib>$(OneOfMyPathVars)\%(Filename).lib</Implib>。由于%(Filename)在链接阶段为空,因此“C:\ foo.lib”不会导致创建ImpLib。这导致了项目中声明的函数未解析的外部因素。可能是链接器中的一个错误,但它是自己造成的。