
Ubuntu日本語フォーラム

ログインしていません。
下記Makefileにコンパイルすると下記のようにErrorが出ました。
ちなみにgcc main.c -o main $(pkg-config --cflags --libs gtk+-3.0) -lm
だとコンパイル通ります。
素人ゆえ知識のご助言を頂きたくよろしくお願い致します。
下記エラーメッセージ:
gcc `pkg-config gtk+-3.0 --cflags` -o main `pkg-config gtk+-3.0 --libs`
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: 関数 `_start' 内:
(.text+0x20): `main' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
Makefile:22: ターゲット 'main' のレシピで失敗しました
make: *** [main] エラー 1
Makefileの中身:
# Makefile
# gcc main.c -o main $(pkg-config --cflags --libs gtk+-3.0) -lm
CC = gcc
SOURCE = main.c
OBJECT = $(SOURCE : .c = .o)
CFLAG = `pkg-config gtk+-3.0 --cflags`
LIB = `pkg-config gtk+-3.0 --libs`
LIB2 = -lm
TARGET = main
# $(TARGET) = $@ there are the same meaning
# 自動変数
# $@ : ターゲットファイル名
# $< : 最初の依存するファイルの名前
# $^ : すべての依存するファイルの名前
#$(TARGET): $(SOURCE)
# $(CC) $(SOURCE) -o $@ $(CFLAG) $(LIB) $(LIB2)
$(TARGET): $(OBJECT)
$(CC) $(CFLAG) -o $@ $^ $(LIB)
#.c.o:
# $(CC) $(CFLAG) -c $<
$(OBJECT):
$(CC) $(CFLAG) -c $<
clean:
rm -f *.o
rm -f main
オフライン
書込時の copy and paste のせいかもしれませんが、もしかして、6行目の OBJECT の定義で () 内に余分な空白が入っていませんか?
あと27, 28 行目も分かりません。依存対象を記述する、つまり、27行目を
$(OBJECT): %.o : %.c
とするか、あるいは Makefile 全体を通して CFLAG を CFLAGS にして 27,28 行目をコメントにするか削除する(つまりコンパイルをmakeの暗黙ruleに任せる)必要があるのでは?
また、お尋ねのエラーメッセージの原因ではありませんが 22行目 link のコマンドに $(LIB2) が抜けています。
オフライン
taka.zoo.nさん
ご返信ありがとうございます。
早速試してみましたので結果を下記に示します。
最終的に
$(OBJECT): $(SOURCE)
$(CC) $(CFLAG) -c $^
とすることでコンパイル通りました。
最終内容:
# Makefile
# gcc main.c -o main $(pkg-config --cflags --libs gtk+-3.0) -lm
CC = gcc
SOURCE = main.c vector.c
OBJECT = $(SOURCE: .c = .o)
CFLAG = `pkg-config gtk+-3.0 --cflags`
LIB = `pkg-config gtk+-3.0 --libs`
LIB2 = -lm
TARGET = main
# $(TARGET) = $@ these are the same meaning
# 自動変数
# $@ : ターゲットファイル名
# $< : 最初の依存するファイルの名前
# $^ : すべての依存するファイルの名前
#$(TARGET): $(SOURCE)
# $(CC) $(SOURCE) -o $@ $(CFLAG) $(LIB) $(LIB2)
$(TARGET): $(OBJECT)
$(CC) $(CFLAG) -o $@ $^ $(LIB) $(LIB2)
#.c.o:
# $(CC) $(CFLAG) -c $<
$(OBJECT): $(SOURCE)
$(CC) $(CFLAG) -c $^
clean:
rm -f *.o
rm -f main
-----------------------------------------------------------------------------
taka.zoo.n による投稿:
Q:書込時の copy and paste のせいかもしれませんが、もしかして、6行目の OBJECT の定義で () 内に余分な空白が入っていませんか?
A:空白を入れてました。ただ空白の有無によってエラーは変わらなかったです。
Q:あと27, 28 行目も分かりません。依存対象を記述する、つまり、27行目を$(OBJECT): %.o : %.c
とするか、あるいは Makefile 全体を通して CFLAG を CFLAGS にして 27,28 行目をコメントにするか削除する(つまりコンパイルをmakeの暗黙ruleに任せる)必要があるのでは?
A:すみません。試していません。
また、お尋ねのエラーメッセージの原因ではありませんが 22行目 link のコマンドに $(LIB2) が抜けています。
ー> ありがとうございます。
オフライン