1

コンパイルにはgnumakeとgccを使用しています。私はLinux(Ubuntu)を使用しています

これは、ノードが最終的なオブジェクトファイルを表すゲームブラックジャックの図です。 ここに画像の説明を入力してください


各クラスが独自のフォルダーにあるコードを整理しました。

tree -d
.
└── classes
    ├── dealer
    │   └── hand
    ├── deck
    │   └── card
    │       ├── card_color
    │       ├── card_suit
    │       ├── card_value
    │       └── colorizer
    ├── discard_pile
    │   └── card
    ├── user
    │   └── hand
    │       └── card
    └── user_choice

ファイルシステムをグラフのように動作させるために、一部のディレクトリはシンボリックリンクです。
繰り返されるコードはありません。
たとえば、実際のカードコードがディレクトリデッキにある場合、handフォルダとdiscard_pileフォルダには、そのディレクトリへのシンボリックリンクがあります。


プログラムがすべてのサブディレクトリオブジェクトファイルにリンクしているため、複数の定義エラーが発生しました。
シンボリックリンクをたどり、いくつかのオブジェクトファイルを複数回収集することになります。
シンボリックにリンクされたフォルダーを無視するように指示することはできません。フォローする必要がある場合があるためです。例:ディーラーフォルダーでドライバープログラムを作成する場合、hand、card、card_color、card_suit、card_value、colorizerオブジェクトを収集する必要があります(handフォルダーはシンボリックリンクですが)。


重複するオブジェクトファイルの収集を継続する方法はありますが、リンクする前にgccに指示するか、重複を無視するようにしますか?
これらはシンボリックリンクであるため、パス名は異なります。
また、オブジェクトに同じ名前が付けられているが、実装が異なる場合もあります。
重複するオブジェクトファイルが実際に同じファイルであり、複数回リンクするべきではないことを識別する方法がわかりません。


大規模で拡大するプロジェクト(実体関連が複雑な場合)の管理方法についてアドバイスを求めて、この質問をあまり一般的にしたくありませんが、私の構造が無意味または問題があると思われる場合は、問題などを指摘してくださいあなたはそれについて行くでしょう。クラス図がないと関係を導き出すのが難しいため、すべてのソースファイルを1つのディレクトリに配置することは避けようとしていました。

4

1 に答える 1

5

異なるコンテキストで同じ関数を複数回使用するからといって、それを複数回リンクする必要があるわけではありません。

すべてcard.cppの異なるコンポーネントで使用できる共通の場所に移動する必要があります。

通常、プロジェクトには一連のヘッダーファイルと一連のソースファイル(たとえば、.cppまたは.c)があります。小さなプロジェクト(約12個未満のソースファイル)で作業するときは、すべてのファイルを1つのディレクトリに保持するだけです。しかし、それをもう少し分割しておくことには何の問題もありません。ただし、ファイルはディレクトリ構造の1か所にのみ配置する必要があります[!!リンクなし!!]。

ヘッダーファイルは、それぞれのソースファイルと一緒にあるか、別の「インクルード」ディレクトリにあります。

通常、ソースファイルはヘッダーファイルがどこにあるかを「気にせず」、単に「どこかに」あります。代わりに、コンパイラに「../some-component」内のヘッダーを検索するように指示します-I ../some-component

そして、各ソースファイルは、最終的なバイナリを形成するために、一度だけコンパイルおよびリンクされます。

于 2013-02-01T01:01:26.160 に答える