2016-09-07 8 views
0

私は実際に大きなプロジェクトに参加しています。コードを理解するための私の第一歩は、mainの機能を検索して、私がアーキテクチャのビジョンを持っていることでした。Cアプリケーションの2つの主な機能

私が発見したのは、複数の主な機能があることです。彼らが異なるフォルダにあるのは事実ですが、私はこのアプリケーションの構築がどのように成功したのか分かりません。私が知っているのは、リンカーが関数main(エントリーポイント)を期待しているということです。

私は、アプリケーションのビルドプロセスを理解することが難しいと思うので、確かにあなたの中にはこれに遭遇したことがあるので、私は尋ねています。

1 - これを理解するための理論的背景がありますか?もしそうなら、記事、本、あなたが望むものを私に提案してください。

2 - を実行する場合、を複数のアプリケーションで使用する必要がありますか?

+0

2種類のバイナリにコンパイルされているのでしょうか?または、相互に排他的なプリプロセッサをガードすることはできますか?またはコードに精通しているシニアの人に尋ねてください。 –

+3

あなたは_do_ビルドプロセスを理解している必要があります。標準的な方法は、複数の '.c'ファイルが複数の' main'関数(例えば 'foo.c'と' bar.c' - 異なるディレクトリにあるかどうか)を持つことです。 2つの別々のプログラム 'foo'と' bar'を生成します。プログラムの中には、テストプログラムやサイドユーティリティがあります。しかし、CPP /マクロトリッキーを使って、1つの 'main'を別のものに「埋め込む」ことができます。 'bar.c':' #define main bar_main'です。次に、 'foo.c'の' main'は 'bar_main'を呼び出すことができます。それを行うには素晴らしい方法ではありません。 –

+0

は、makefileを長く見て、プロジェクトのドキュメントを読んでください。 単一の実行可能ファイルか複数の実行可能ファイル 最終的な実行可能ファイル – user3629249

答えて

5

1つの実行ファイルに複数のmain関数を含めることはできません。いくつかの可能性があります。

ビルドを実行すると1つのアプリケーションしか作成されない場合、main関数のうちの1つだけがコンパイルされます。 (または、実行可能ファイルではなくライブラリを作成するオプションがある場合は、何もありません。)アプリケーションのどの変形、ターゲットシステムなどによって、どれをビルドするかを決めるオプションがあります。

おそらく、アプリケーションは複数の実行可能ファイルで構成され、それぞれに1つのmainという機能があります。

ビルドを実行すると、長すぎるを取っていない場合は、私が実際にコンパイルされた複数のソースファイルのかを決定するために使用しましたトリックは次のように、一時的に#errorディレクティブを追加することです:

#error "TEMPORARY: This is /full/path/to/source.cpp" 

結果のエラーどのソースファイルが実際にコンパイルされたかを示すメッセージが表示されます。 (あなたのコンパイラがサポートしている場合にも#warningディレクティブを使用することができます。)

+0

良いトリック私はそれを使用します、1つのポイントは、 "おそらくアプリケーションは、複数の実行可能ファイルで構成されています"、アプリケーションで複数の実行可能ファイルを選択する必要がある場合は、組織のもの(それは私にとっては非常に醜いです) sth else – Mouin

+0

@Mouin:一例:GNU Coreutils。 –

0

私は、これをundestandするtheoricalバックグラウンドを持っている私の記事は、あなたはいくつかの理解を持っている必要があり、これまで何を

をしたい予約をお勧めすべきビルドとは何かを意味しますが、より重要なことは、特定の環境におけるビルドプロセスを理解する必要があることです。あなたが理解しておく必要があります。

  1. ビルドターゲット(実行可能ファイルおよび共有ライブラリ)それらが使用する
  2. コンパイラ設定のリストを(あなたは、VS 2010と同様にVS 2012のためのDLLを構築することができます)。

1つのアプリケーションでいくつかのメイン関数を使用する必要がありますか。

  1. ビルドシステムは、複数の実行可能ファイルを構築するとき、あなたは複数のmainの機能が必要になります。

  2. いくつかの設定に応じてビルドシステムがfile1.cまたはfile2.cを選択して実行可能ファイルを作成すると、mainの機能がfile2.cおよびfile2.cにあります。これはコードを編成するにはやや難しい方法ですが、可能です。リンカーは、どちらか一方を選択することができないように失敗する同じ識別子(ここでは別名main)のための複数の定義を用いて実行可能ファイルをリンクしようと

+1

短い答え - 大きなプロジェクトに入ると、何も理解できません。あなたは何かを知る必要があります。学び、あなたの同僚に尋ねる。 – ddbug

0

複数のmainエントリポイントを持つことができますが、ビルドプロセスでは1つだけを選択することもできますが、1つの可能性があります。

私はこれを簡単な例で説明します:mainの定義を含むモジュールを持つライブラリ(.a静的ライブラリ)があるとします。ライブラリがリンクされているときの識別子の実際の必要性に応じてリンク時にライブラリモジュールが選択されるので、モジュールにmainの定義を持たせることができます。あなたはそれを適切に定義しています。これは-ll(フレックスはyylex()関数を呼び出すmainという定義があります)、-ly(bisonにはyyparse()というルーチンを呼び出す主な定義があります)などのいくつかの標準ライブラリで利用されています。

たとえば、ライブラリ-llの後にメイン関数をリンクしたように、ライブラリが含まれているときにmainが解決されていないため、 ldリンカーに苦情を申し立てる)

関連する問題