2017-12-08 6 views
1

C++プロジェクト用に以下のディレクトリ構造を作成しようとしています。GNUワイルドカードを使って各ファイルを別々にビルドディレクトリにコンパイルします

├── Project 
├── Makefile 
│ ├── build/ 
│ ├── src 
│ │ ├── include/ 
│ │ ├── cpp/ 
│ │ loader.s 
│ │ linker.ld 

私はまた、別のターゲットでビルドディレクトリとリンクに別々に各.cppファイルをコンパイルしたいです。

私はこれを行うには、ワイルドカードとのトラブルを抱えています:

BUILD = ./build/ 
OBJS  = $(patsubst src/cpp/%.cpp,build/%.o,$(wildcard src/cpp/*.cpp)) 
CPPFLAGS = -I ./src/include -Wfatal-errors -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fno-leading-underscore 

$(BUILD)kernel.elf: $(BUILD)loader.o $(OBJS) 
    $(ARMGNU)-ld -T ./src/linker.ld -o [email protected] $^ 
    $(ARMGNU)-objdump -D $(BUILD)kernel.elf > $(BUILD)kernel.list 

$(BUILD)%.o: ./src/%.s 
    $(ARMGNU)-as $(AFLAGS) -c -o [email protected] $^ 

$(BUILD)%.o: ./src/cpp/%.cpp 
    $(ARMGNU)-gcc $(CPPFLAGS) -c -o [email protected] $^ 

リンクステップが空$(OBJS)を取得するようbuild/%.o年代が構築されることはありません。このための正しい構文は何ですか?

+1

は、ビルド/ ''に 'BUILD'を設定してみてください。 '。/'接頭辞はルールマッチングを破る可能性があります。私も$(OBJS)が空ではないと思っています。あなたは$(info $(OBJS))でそれをチェックできます。 – xaizek

+0

それはそれを正確にした!良いですね!私はそれを受け入れることができるように答えを加えてください。または、質問を削除する必要がありますか? –

+1

私は本当にどのような条件で質問を削除すべきか分かりません。私はこれが答えがパスを一致させることでは初めてではないと思うので、誰かが同様の質問を見つけたら、それは重複として閉じられるかもしれません。 – xaizek

答えて

2

BUILDの変数は./build/に設定され、OBJのオブジェクトファイルはbuild/で始まります。パスが正規化されていないため、追加./接頭辞は、makeによって規則マッチングに影響を与えること

./build/kernel.elf: ./build/loader.o build/... 
./build/%.o: ./src/%.s 

:膨張後のルールは次のように見えます。

修正が設定することで、ターゲットの目標と前提条件の試合でプレフィックスを作るのと同じくらい簡単です:

BUILD = build/ 
関連する問題