0

UnitTest というフォルダーがあります。その中にいくつかの .c ファイルがあります。すべてのファイルには関数「main」が含まれています。

makefile を使用して、そのフォルダーのすべての .c ファイルをまとめてコンパイルしたいと考えています。ただし、これらのファイルは、別のフォルダーにある他の C ファイルに依存しています。

このためのmakeファイルをどのように書くことができますか?

例えば。Common\*.c - オブジェクト ファイルの生成 App\*.c - オブジェクト ファイルの生成。- Common ディレクトリ UnitTest\ .c の .o ファイルを指します- これらのファイルは実行可能ファイルとしてコンパイルする必要があります。ディレクトリ App および Common から *.o を参照してください。

更新: ヘッダー ファイルは \Include という別のディレクトリにあります

これには単一のメイクファイルが必要です。助けてください。

4

2 に答える 2

2

標準に従って、すべてのディレクトリには 1 つの Makefile が含まれます。したがって、ディレクトリが 3 つある場合は、このジョブの Makefile を 3 つ作成できます。

(d) common
 |
 |---(f) common.h
 |---(f) common.c
 |---(f) Makefile --- MAkefile for the common folder.

(d) app
 |
 |---(f) app.h
 |---(f) app.c
 |---(f) Makefile

(d) unittest
 |
 |---(f) unittest.h
 |---(f) unittest.c
 |---(f) Makefile

(f) Makefile --- invoke all makefiles in the mentioned order. 

1 つの Makefile でこれらすべてを実行したい場合は、その方法でも実行できます。ここでは、ファイルのパスを指定してファイルをコンパイルする必要があります。秩序は最も無力です。

于 2013-07-24T13:16:08.527 に答える
1

これは複雑なので、段階的に説明します。まず、オブジェクト ファイルを構築します。

CFLAGS += -I/include

vpath %.h /include

Common/Apps/またはでオブジェクト ファイルを作成するには、これで十分UnitTest/です。先に進む前にこれをテストしてください。

次に、すべてのオブジェクトをビルドしますCommon/

COMMONSOURCES := $(wildcard Common/*.c)
COMMONOBJECTS := $(COMMONSOURCES:.c=.o)

all: $(COMMONOBJECTS)

先に進む前にこれをテストしてください。

allそのルールを削除し、共通ライブラリのルールを追加します。(少し単純なので、ここでは静的ライブラリを使用します。)

Common/libCommon.a: $(COMMONOBJECTS)
    ar -cvq $@ $^

それだけのテストを行い、それがどのように機能したかをコメントで教えてください。その後、AppsライブラリとUnitTest実行可能ファイルをビルドします。

于 2013-07-24T13:19:32.587 に答える