0

私は 3 つのプロジェクトで C++ ソリューションを継承しました。1 つは .DLL にコンパイルし、もう 2 つは .EXE にコンパイルします。DLL はそれ自体で問題なくビルドされますが、他の 2 つは、ビルド時に約 65 個の LNK2005 エラーを生成します。その大部分は、以下のログに示すように、同じ .obj ファイルを参照しています。


Linking...
Function.obj : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/OPT:ICF' specification
Function.obj : error LNK2005: _ReadLocalRegister already defined in Function.obj
Function.obj : error LNK2005: _getSource already defined in Function.obj
Function.obj : error LNK2005: _SendLogEvent already defined in Function.obj
Function.obj : error LNK2005: _DebugMsg already defined in Function.obj
Function.obj : error LNK2005: _MyInformationMsg already defined in Function.obj
MyNTService.obj : error LNK2005: "public: __thiscall CMyNTService::CMyNTService(void)" (??0CMyNTService@@QAE@XZ) already defined in MyNTService.obj
MyNTService.obj : error LNK2005: "public: virtual void __thiscall CMyNTService::OnStop(void)" (?OnStop@CMyNTService@@UAEXXZ) already defined in MyNTService.obj
MyNTService.obj : error LNK2005: "public: void __thiscall CMyNTService::SaveStatus(void)" (?SaveStatus@CMyNTService@@QAEXXZ) already defined in MyNTService.obj

……続きます!

私は C# コーダーであり、C++ の基本的な知識しか持っていないので、これで迷ってしまいます。このソリューションは、VS2008 で C++ ソリューションとして再構築しようとしている 15 年前の C ソリューションです。私はそれを一度ビルドできましたが、何も変わっていませんが、それ以来、いくつかの構成設定が変更されている可能性があります。

私が見始めることができるアイデアを持っている人はいますか...?

どうもありがとう!

4

2 に答える 2

0

そのオブジェクトのヘッダー ファイルにインクルージョン ガードがないようです。

追加:

#ifndef SomeUniqueName
#define SomeUniqueName

//Code goes here.

#endif

コードをヘッダー ファイルにラップします。コンパイラは、多くの場所に含まれているため (ほとんどの場合)、コードを処理するときにそのヘッダー ファイルを何度も調べます。包含ガードは、以前のパスで既に定義されているものの再定義を停止します。

PS: 「クリーンにする」ことも役立つかもしれません。Makefile は、特に 100% 正しく作成されていない場合に厄介になる可能性があり、依存関係がオフになっている場合は、再構築する前にクリーンアップする必要がある場合があります。

于 2012-08-07T14:03:04.463 に答える