0

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

1 回答 1

0

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

于 2010-07-02T19:22:33.420 回答