web-dev-qa-db-ja.com

Cで複数の実装ファイルをリンクする方法

.cファイルがいくつかあります。つまり、実装ファイルには次のように書かれています。

  • main.c
  • 交流
  • 紀元前

任意のファイルの関数が別のファイルの任意の関数を呼び出すことができる場合。私の質問は、.h、つまりAとBの実装ごとにヘッダーファイルが必要ですか。各ヘッダーファイルの定義は[〜#〜] all [〜#〜]です。 AまたはBで機能します。

また、main.cにはA.hB.h #includedの両方が含まれますか?

誰かが最終的にそれを明らかにすることができたら、また、後でターミナルで複数のファイルをコンパイルして実行するにはどうすればよいですか?.

ありがとう。

8
Kraken

ヘッダーの内容

A.hのヘッダーA.cには、A.cで定義された機能を使用する外部コードに必要な情報のみを含める必要があります。静的関数を宣言するべきではありません。静的変数を宣言するべきではありません。内部型(A.cでのみ使用される型)を宣言するべきではありません。ファイルが#include "A.h"だけを使用できることを確認してから、A.cによって公開された機能を最大限に活用する必要があります。自己完結型でべき等であり(コンパイルエラーなしで2回含めることができるように)、最小限である必要があります。 #include "A.h"の最初の#include行としてA.cを書き込むことで、ヘッダーが自己完結型であることを簡単に確認できます。 2回含めることで、べき等であることを確認できます(ただし、別のテストとして実行することをお勧めします)。コンパイルされない場合は、自己完結型ではありません。同様に、B.hおよびB.cについても同様です。

ヘッダーと標準の詳細については、「 ヘッダーで#includeを使用する必要がありますか? 」(NASAコーディング標準を参照)および「 静的ライブラリへのリンク 」を参照してください。 = '。これには、自己完結性とべき等性をテストするために使用するスクリプトchkhdrが含まれています。

リンク

main.omain.cA.h、およびB.hに依存しますが、main.c自体はヘッダーに依存しないことに注意してください。

コンパイルに関しては、次を使用できます。

gcc -o program main.c A.c B.c

他のオプションが必要な場合は、それらを追加します(最初にほとんどのフラグ、最後にライブラリ、ソースコードの後)。各ファイルを個別にオブジェクトコードにコンパイルしてから、オブジェクトファイルをリンクすることもできます。

gcc -c main.c
gcc -c A.c
gcc -c B.c
gcc -o program main.o A.o B.o
21

.cファイルで宣言されているものが別の.cファイルで必要な場合は、ヘッダーファイルを提供する必要があります。

一般的に言えば、宣言されたすべての関数またはexternシンボルをエクスポートするすべてのソースファイルのヘッダーファイルを持つことができます。

実際には、すべての関数またはすべての変数をエクスポートする必要はなく、別のソースファイルで必要なものだけをエクスポートし、必要なファイル(および特定のヘッダーファイルとペアになっているソース)に含める必要があります。 )。

それがどのように機能するかを理解しようとするときは、すべてのソースファイルが独自にコンパイルされるという事実を考えてください。したがって、ソースファイルで直接宣言されていないものを使用する場合は、ヘッダーファイルを介して宣言する必要があります。このようにして、コンパイラはすべてが存在し、正しく入力されていることを知ることができます。

3
Jack

コンパイラによって異なりますが、gccを使用していると仮定すると、次のようなものを使用できます。

gcc -Wall main.c A.c B.c -o myoutput

詳細については、 http://www.network-theory.co.uk/docs/gccintro/gccintro_11.html (最初のGoogle Answers)を参照してください。複数のオブジェクトファイル/ライブラリにコンパイルできます。

gcc -c main.c
gcc -c A.c
gcc -c B.c
gcc -o mybin main.o A.o B.o
3
Youn Elan