ページ 11

gccのMakerFileでエラー

Posted: 2017年6月22日(木) 14:47
by 完熟メロン
初めてLinuxで開発することになり四苦八苦しています。
gccのMakerFileが下記エラーになります。

「hogeに必要なターゲット `obj/main.o' を make するルールがありません」

試しに「$(OBJ_DIR)/%.o:」の「%」を「$(OBJ_DIR)/main.o:」とすると
上記エラーは解消されるので「%」が動作していないように思えます。
(次のオブジェクトファイルでエラーになりますが…)

アドバイスをいただけると助かります。
よろしくお願いいたします。

コード:

CC      = gcc
CFLAGS  = -MMD -MP -O3 -Wall -fPIC -std=c99 
LDFLAGS = 
LIBS    = ./core/libhoge.a
INCLUDE = ./src/
SRC_DIR = ./src
OBJ_DIR = ./obj
SOURCES = $(shell find $(SRC_DIR)/* -name *.c)
OBJS    = $(addprefix $(OBJ_DIR)/, $(notdir $(patsubst %.c, %.o, $(SOURCES))))
TARGET  = hoge
DEPENDS = $(OBJS:.o=.d)
#$(warning $(OBJS))

all: $(TARGET)

$(TARGET): $(OBJS) $(LIBS) 
	$(CC) $(LDFLAGS) -o $@ $^

$(OBJ_DIR)/%.o: %.c 
	@if [ ! -d $(OBJ_DIR) ]; \
		then echo "mkdir -p $(OBJ_DIR)"; mkdir -p $(OBJ_DIR); \
		fi
	$(CC) $(CFLAGS) -I $(INCLUDE) -o $@ -c $< 

clean:
	$(RM) $(OBJS) $(TARGET) $(DEPENDS)

-include $(DEPENDS)

.PHONY: all clean

Re: gccのMakerFileでエラー

Posted: 2017年6月23日(金) 18:03
by いわん
ソースファイル名の取得で shell 関数を使っていますので、実際にコマンドラインで実行してファイル名が取得できるかやってみてはどうでしょうか。
>find ./src/* -name *.c

shell でうまくいかない場合は wildcard を使う方法もあります。
SOURCES = $(notdir $(wildcard $(SRC_DIR)/*.c))
(wildcard でパスの一覧を取得して、notdir でファイル名のみ取り出します。)

マクロにディレクト名を含めるとファイル名のみほしいところにディレクトリ名がくっついてしまったりするので注意が必要です。

Re: gccのMakerFileでエラー

Posted: 2017年6月23日(金) 22:56
by 朱鷺
完熟メロン さんが書きました: gccのMakerFileが下記エラーになります。

「hogeに必要なターゲット `obj/main.o' を make するルールがありません」
configureは実行しましたか?
makeコマンドはMakefile (×MakerFile)を読み込んで、指定された処理を実行するのですが、
このMakefileは初期状態では単なるテンプレートでしかなく、make実行前にconfigureをいう
スクリプトを実行して実行環境に合わせた設定を行う必要があります。
Makefileがあるディレクトリの中にconfigureというファイルはありませんか?
ある場合は、1度configureを実行(configureがあるディレクトリに移動して「./configure」を実行)
してからmakeコマンドを実行するとどうでしょうか。