お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2017-03-19 07:47:33

uji
メンバ
登録日: 2014-07-27

Makefileによるコンパイル方法について

下記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

オフライン

 

#2 2017-03-20 17:50:28

taka.zoo.n
メンバ
登録日: 2013-05-30

Re: Makefileによるコンパイル方法について

書込時の copy and paste のせいかもしれませんが、もしかして、6行目の OBJECT の定義で () 内に余分な空白が入っていませんか?
あと27, 28 行目も分かりません。依存対象を記述する、つまり、27行目を
    $(OBJECT): %.o : %.c
とするか、あるいは Makefile 全体を通して CFLAG を CFLAGS にして 27,28 行目をコメントにするか削除する(つまりコンパイルをmakeの暗黙ruleに任せる)必要があるのでは?
また、お尋ねのエラーメッセージの原因ではありませんが 22行目 link のコマンドに $(LIB2) が抜けています。

オフライン

 

#3 2017-03-20 18:30:14

uji
メンバ
登録日: 2014-07-27

Re: Makefileによるコンパイル方法について

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) が抜けています。

ー> ありがとうございます。

オフライン

 

Board footer

Powered by FluxBB