2

gcc 4 と cmake を使用してコンパイル プロセスを管理する GNU/Linux 用のアプリケーションを開発しています。同じ名前のファイルが2つあるが、次のように他のディレクトリと名前空間にある場合、問題はないことがわかりました。

.  
|-- gfx  
|   |-- Object.cpp  
|   `-- Object.h  
`-- logic  
    |-- Object.cpp  
    `-- Object.h  

最初の Object クラスは Gfx 名前空間にあり、2 番目は Logic 名前空間にあります。

次に、Visual C++ 2008 Express Edition を使用してこのプロジェクトをコンパイルしようとしました。リンカーは、Gfx::Object クラスの存在しない実装に関するいくつかのエラーをスローしました。いくつかのチェックの後、次のことがわかりました。

  • Visual C++ は 2 つの Object.cpp ファイルを追跡しています
  • 最初または 2 番目のファイルで変更が発生すると、オブジェクト ユニットの再コンパイルがキューに入れられます。
  • 実際に変更されたファイルに関係なく、常に 2 番目の Object.cpp のみを再コンパイルします。

また、Visual C++ では同じ名前の 2 つのクラスを作成できないこともわかりました。

これに対する解決策はありますか?コードの大部分をリファクタリングしたくありません。

4

4 に答える 4

7

両方の Object.cpp ファイルが Object.obj にコンパイルされます。同じディレクトリに。つまり、コンパイルされた最後のものは、最初のものの Object.obj を上書きします。はい、リンカーはそれでわくわくすることはありません。同じ Object.obj ファイルを2回リンクするため、複数のシンボルが定義されます。

修正は簡単です。Object.cpp ファイル、プロパティ、C/C++、出力ファイルのいずれかを右クリックします。オブジェクト ファイル名を $(IntDir)\ から $(IntDir)\$(InputName)2.obj に変更します。

于 2009-12-28T11:24:36.810 に答える
2

問題は、デフォルトで VC++2008 がすべてのオブジェクト ファイルを 1 つの出力フォルダーに配置するため、最初の object.obj ファイルの存在が 2 番目の依存関係を満たすため、コンパイルされないことです。たとえそうであったとしても、最初のものを上書きします。

できるようにする必要があるのは、中間ディレクトリ設定をコンパイル中のファイルに依存させることです。ただし、 $(InputDir)およびその他のさまざまな組み合わせに設定しようとしましたが、可能な場合もありますが、機能する構成を実現できませんでした。利用可能なマクロは、ここに記載されています。

「makefile」プロジェクトを使用できず、make、nmake、または cmake などでビルドを管理できなかった場合、実行していることに根本的な問題は何もないため (不適切なアドバイスであっても)、それだけです。 IDE で簡単にサポートされるわけではありません。

于 2009-12-28T10:32:39.927 に答える
1

これは既に回答済みですが、Beta 2 での私の経験に基づいて、競合が発生した場合、Visual Studio 2010 が 2 つの .obj ファイルを自動的に別のディレクトリに配置することも追加したいと思います。

編集: うーん、これは間違っています! 本当の答えは、CMake が自動的にこれを行っていたということです。

于 2009-12-28T11:53:23.373 に答える
0

承認されたソリューションは、スケーリングできないため、最適ではありません。

Visual Studio 2010で、設定しました

    Properties -> C/C++ -> Output Files -> Output File Name

    V:\%(Directory)$(PlatformName)_$(ConfigurationName)_%(Filename).obj

プロジェクトがドライブにあると仮定すると、OBJファイルがソースの隣に配置されますV(マクロがあるかどうかはまだわかりません)。

どちらも最適ではありませんが、少なくとも、腱鞘炎を発症することなく、多くのソース ファイルのサブシステムを簡単にフォークできます。

ちなみに、$(InputDir)solution/projectディレクトリを参照しており、別のディレクトリでも同じ問題が発生します。

于 2012-08-30T16:13:23.617 に答える