2017-05-14 7 views
0

私は現在、1つのプロジェクトごとに変更することなく、複数のプロジェクトで使用できるMakefileを試しています。しかし、私は最近Cでプログラミングを始め、Makefilesを作成しました。C Makefile - 異なるファイルの終わりのサブディレクトリ

これは私の現在のプロジェクト構造です。

project 
| src 
    | gd.c, gd.h, geom.c(only file with main function) 
| obj // *.o files should be created here 
| bin // executable should be created here 
| Makefile 

これは私がこれまで構築してきたものですが、コンパイル/リンクされたファイル用のサブディレクトリを指定する方法を全くわかりません。

1 TARGET = projectname 
2 LIBS = -lm 
3 CC = gcc 
4 CFLAGS = -std=c11 -Wall 
5 LD = gcc 
6 LDFLAGS = -Wall 
7 
8 SRCDIR = src 
9 OBJDIR = obj 
10 EXEDIR = bin 
11 
12 SOURCES = 
13 HEADERS = 
14 OBJECTS = 
15 
16 $(EXEDIR)/$(TARGET): $(OBJECTS) 
17  $(LD) $(OBJECTS) $(LDFLAGS) -o [email protected] $(LIBS) 
18 
19 $(OBJECTS): $(SOURCES) $(HEADERS) 
20  $(CC) $(CFLAGS) -c $< -o [email protected] 
21 
22 .PHONY: clean 
23 clean: 
24  rm -f *.o 
25 
26 .PHONY: remove 
27 remove: clean 
28  rm -f $(EXEDIR)/$(TARGET) 

私の質問は次のようになります。

  1. どのように私はこれらのファイルを作成し、それらが私のレイアウトやそれに似たもので、それぞれのサブディレクトリに置くことができますか?
  2. makeコマンドを使用するときに必要なフォルダ(objとbin)を作成することはできますか?もしそうなら、どうすればいいですか?
+0

ファイル 'sources.mk'をすべての' * .c'を含むファイルを作成する必要があります。その 'sources.mk'ファイルを' Makefile'に含めます。オブジェクトファイルとbinファイルについては、 'Makefile'でそれらのディレクトリを直接指定することができます – Gaurav

+0

あなたが望むものは明確ではありません。 'src /'で見つかったすべてのソースをコンパイルしてリンクするメイクファイルが必要ですか?または、ソースファイルのプールから複数の異なる実行可能ファイルを作成し、それぞれのソースを適切に選択できるmakefile? – Beta

答えて

1

私がうまくいけば、あなたのレイアウトで、あなたのMakefileを動作させるソース、ヘッダー、OBJECTSの値を設定する方法を知りたいと思っています。このため

あなたが使用できる正規表現:

SOURCES = $(wildcard $(SRCDIR)/*.c) 
OBJECTS = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES)) 
HEADERS = $(patsubst %.c,%.h,$(SOURCES)) 

wildcardドキュメントhere

patsubstドキュメントhere

あなたは完全に再利用可能なMakefileを作成したい場合、これは、単純な答えでありますたとえば、ソースのサブフォルダを処理する必要があります。

オブジェクトを作成するルールは変わっています(おそらく動作します)。 SOURCES変数が無駄になる。この場合

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

:私はあなたが一度に一つのソースで1つのオブジェクトのようなものを作成するためのルールを使用する場合、それが良いと思います。

またコンパイル処理に使用すると、ヘッダをgccのために与えることはありませんが、ヘッダはgcc ... -I<headers folder>

でフォルダとあなたのきれいなので、ヘッダー変数は、内のオブジェクトファイルを削除するrm -f $(OBJDIR)/*.oであるべきだと思い無用ですobjフォルダ

編集

私はあなただけのファイルを作成する前にフォルダを作成するために、シェルコマンドを使用することができ、2つ目の質問を忘れてしまった:

$(OBJDIR)/%.o: $(SRCDIR)/%.c 
    @mkdir $(OBJDIR) 
    $(CC) $(CFLAGS) -c $< -o [email protected] 
関連する問題