8

ここに私のフォルダ構造があります:

/
|
 -- program.cpp
 -- utility.h
 -- utility.cpp
|
 -- module/
    |
     -- utility.h
     -- utility.cpp

// Note that I have two files named utility.h and two named utility.cpp

プロジェクトをビルドすると、一部のシンボルが定義されていないというリンク エラー (LNK2028: 未解決のトークンなど) が表示されます。すべてのシンボルが定義されていること、および宣言されたすべての関数に対応する定義があることを確認しました。

utility.cppプロジェクトをコンパイルすると、両方のフォルダーのファイルがutility.obj出力フォルダーで同じものにコンパイルされるような気がします。その結果、一方が他方を上書きします。

  1. これは予想される動作ですか?
  2. 同じ名前の 2 つのファイル (異なるフォルダーにあります) を持つ C++ バイナリをビルドするにはどうすればよいですか?
4

6 に答える 6

12

両方/どちらかの .cpp ファイルを右クリック > properties> C/C++> Output Files> Object File Name> カスタム名を設定します。たとえば、両方のファイルがMyFile.cppfolderで指定されA、別のファイルが folder で指定されている場合、出力をおよびBに設定できます。AMyFileBMyFile

または、マクロを使用して、オブジェクト名の前に直接の親フォルダー名を付けることもできます (つまり、 を使用$(IntDir)\$(SafeParentName)$(SafeInputName))。これでは不十分で (たとえば、A/B/MyFile.cppとがあるC/B/MyFile.cpp場合)、オブジェクト ファイルがソース ツリーに散らかっていてもかまわない場合は$(InputDir)\、オブジェクト ファイルをソース ファイルと同じフォルダーに配置する which を使用することもできます。

cpp ファイルは、2 つの異なるオブジェクト ファイルにコンパイルされます。

楽しい!

VS2010 の更新: VS2010にはより良い解決策があります。こちらで確認してくださいn1ckさんのコメントに感謝

ところで、内容が同じ名前の場合、異なる名前空間を使用してそれらを分離しますか?

namespace A { // in folder A
    class CMyFile {};
};

namespace B{ // in folder B
    class CMyFile {};
};

// client.cpp
#include "A/MyFile.h"
#include "B/MyFile.h"
int main() {
    A::CMyFile aMyFile;
    B::CMyFile bMyFile;
    return 0;
}

それが重要かどうかはわかりませんが、人間にとっては間違いなく明確です:D

于 2010-02-17T15:27:00.943 に答える
2

別のプロジェクトをソリューションに追加してみてください。これmudule.libにより、モジュールの から静的ファイルが作成され.cpp .h、メイン プロジェクトがそのライブラリにリンクされます。VSは別ディレクトリに.objファイルを出力するようになり、問題なくリンクできるはずです。

于 2010-02-17T15:01:10.150 に答える
1

同じプロジェクトに 2 つの異なるが同じ名前のファイルが本当に必要ですか?

于 2010-02-17T15:03:25.860 に答える
1

うまく機能する最も簡単な方法は、ソース ディレクトリに基づいて、競合する .obj を別のサブフォルダーに配置することです (2003 と 2008 でこの手法を使用しました)。

例えば:

src\gui\utils.cpp の場合は「オブジェクト ファイル名」を「.\Debug\gui/」に設定し、src\database\utils.cpp の場合は「.\Debug\database/」に設定します。

競合を見つけるたびに手動で実行していますが、すべての .cpp ファイル (または競合しているファイル) のプロジェクトを更新するスクリプトを作成するのは非常に簡単な作業であると想像できます。

于 2010-12-27T22:28:30.967 に答える
0

おそらくライブラリ(静的または動的)があなたのケースに役立つでしょう。ただし、実行可能ファイルや他のライブラリのように同じ名前のパブリック シンボルがある場合は、まだ問題が発生します。

于 2010-02-17T15:02:27.413 に答える
0

VS コンパイル チェーンがわかりません。

ただし、各 .cpp は最初に .obj ファイルにコンパイルされます。リンク手順により、それらがマージされます。

すべての .obj ファイルを同じディレクトリに置くことは非常に一般的です。したがって、ご想像のとおり、2 番目のものをコンパイルすると、最初のものは消去されます。そのため、コンパイル中にいくつかのシンボルが欠落しています。

おそらく、.obj を .cpp ファイルと同じディレクトリに残すオプションがあります (繰り返しますが、私は VS を使用していません)。欠点は、ソース コード ツリーにガベージがあることです。

私の個人的な意見は、リファクタリングすることです。

于 2010-02-17T15:03:12.907 に答える