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 ファイルが 1 つしかないことに気付きました。プロジェクトには 2 つの .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 に答える