2011-08-14 13 views
2

よく似た質問ですが、頻繁に聞かれる質問には正確ではありません。私のプロジェクトは、私は、SRCに含まれるファイルをコンパイルするために、(コードブロックのディレクトリにあります)私のメイクファイルを取得しようとしている、基本的には以下のレイアウト(クロスプラットフォーム、したがって異なるのIDEなど)非標準のディレクトリレイアウト内のメイクファイル

[Project] 
    | 
    |--- codeblocks 
    |  |- obj 
    |--- src 
    |--- visual_studio 

を持っていますオブジェクトファイルをobjディレクトリに配置します。

私は問題なくacheiveすることができますが、私は私の人生はオブジェクトファイルためデフォルト場所としてこの代替ディレクトリを使用するために作る伝える方法を見つけ出すことはできませんため、コンパイル側。後でそれらを移動することはできますが、makefileのオブジェクトを破るビルドを行うたびにアプリケーション全体を再コンパイルする必要があることを意味します。

私はいくつかの例を紹介しましたが、 $(OBJDIR)/%.o: %.cのようなものがありますが、makeはそれを利用するためのルールを見つけることができません、と私は自分自身のためにそれをうまくするのに十分な経験を積んだほど遠い午前:(

誰もが正しい方向に私を指すか、いくつかの適切なヒントを提供することができますか?

答えて

1

これを行う方法を示す簡単なサンプルのMakefileがあります。

SOURCES = $(wildcard src/*.c) 
OBJECTS = $(SOURCES:src/%.c=obj/%.o) 

obj/%.o: src/%.c 
     $(CC) $(CFLAGS) -c -o [email protected] $< 

target.exe: $(OBJECTS) 
     $(CC) -o [email protected] $^ $(LDFLAGS) $(LDLIBS) 

ディレクトリ構造とのMakefileで必要なファイルは、次のとおりです。

project/ 
project/Makefile 
project/src/*.c 
project/obj 

私は私のマシン上でこれをテストし、それが正しく実行された:返信用

$ make 
cc -c -o obj/main.o src/main.c 
cc -o target.exe obj/main.o 
+0

完璧!美しく働いています。私はマニュアルをもう一度見直し、私が正しくそれを得ていると断言するつもりです! – sighbeans

0

あなたはGNU makeを使用している場合は、拡張を使用することができますあなたのようなパターンルールが記述できます。ルールを設定することができます。

$(OBJDIR)/%.o: $(SRCDIR)/%.c 
     $(CC) $(CFLAGS) -c -o [email protected] $^ 

ソースファイルをコンパイルします。さらに複雑な問題は、リンクするルールですべてのオブジェクトファイルに対して$(OBJDIR)も指定する必要があることです。あなたは、これらすべての場所で$(SRCDIR)の必要性を回避するためにVPATHを使用することができ、代わりに

SOURCES = $(wildcard $(SRCDIR)/*.c) 
OBJECTS = $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o) 

$(TARGET): $(OBJECTS) 
     $(CC) -o [email protected] $^ $(LDFLAGS) $(LDLIBS) 

のようなものを使用することができます。

+0

おかげで、悲しいことに私は」 mはまだ前と同じエラーになります: 'code'(2)%make proj make:*** 'proj'が必要とする 'obj/*。o'をターゲットにするルールはありません。やめる。 (2)%make --version GNU Make 3.82 'code' – sighbeans

+0

Makeは自動的にグロブを展開しません。 –

関連する問題