9

私はこのエラーが殴打されて死んだことを知っていますが、それを機能させることができないようです。私は自分のmakefileを以下にリンクしました:

all: gensine info cs229towav

encode.o: encode.h encode.c
    gcc -c encode.c

write.o: write.c write.h
    gcc -c write.c

gensine.o: encode.c gensine.h gensine.c helper.c write.c
    gcc -c gensine.c -lm

helper.o: helper.c helper.h
    gcc -c helper.c

read.o: read.h read.c
    gcc -c read.c

info.o:read.c info.h info.c decode.c
    gcc -c info.c

decode.o: decode.c decode.h helper.c
    gcc -c decode.c

cs229towav.o: write.c read.c cs229towav.c cs229towav.h helper.c decode.c encode.c
    gcc -c cs229towav.c -lm

gensine: encode.o gensine.o write.o helper.o
    gcc -o gensine encode.o gensine.o write.o helper.o -lm

info: read.o info.o decode.o helper.o
    gcc read.o info.o decode.o helper.o

cs229towav: write.o read.o cs229towav.o decode.o encode.o helper.o
    gcc -o write.o read.o cs229towav.o decode.o encode.o helper.o -lm

Clean:
    rm -rf *o gensine info cs229towav

「makegensine」などのコマンドを実行すると、次の結果が返されます。

>cc gensine.c -o gensine
/tmp/ccojm09X.o: In function `encodeCsFormat':
gensine.c:(.text+0x4b1): undefined reference to `sin'
/tmp/ccojm09X.o: In function `encodeWavFormat':
gensine.c:(.text+0xa39): undefined reference to `sin'
collect2: error: ld returned 1 exit status

これを読んだ後、これは数学ライブラリにある罪への未定義の参照を言います。リストされている関数は、「gensine.c」ファイルに含まれている「encode.c」ファイルにあります。

4

1 に答える 1

12

makefileのコマンド:

gcc -o gensine encode.o gensine.o write.o helper.o -lm

最後に印刷したコマンドと一致しません:

cc gensine.c -o gensine

ないことにも注意してください-lm

はオブジェクトファイルの作成方法をmake知っているので、ほとんどのmakefileは必要ありません。これを試してください(TABでインデントすることを忘れないでください):

.PHONY : all clean
all = gensine info
CFLAGS =-Wall
LIBS = -lm

gensine: encode.o gensine.o write.o helper.o 
       gcc -o $@ $^ $(LIBS)

info: read.o info.o decode.o helper.o
       gcc -o $@ $^ $(LIBS)

cs229towav: write.o read.o cs229towav.o decode.o encode.o helper.o
       gcc -o $@ $^ $(LIBS)

clean:
       rm -rf *.o gensine info cs229towav

編集:

Boddie、makefileがスクリプトだと思ったために、混乱が生じたことに注意してください。make入力したときに名前が付けられたスクリプトを実行していたことmake gensine。実際にmakeは、ファイルシステムの他の場所と同様のコマンドgccです(Linuxなどでは、入力which makeしてどこにあるかを確認してください)。このコマンドは、呼び出された、または現在のディレクトリにあるmakeビルドルールを含む入力ファイルを見つけることを想定しています。そのファイルが見つからない場合は、代わりにいくつかの組み込みルールを使用します。したがって、これはmakefileのどこにもありません。必要に応じて、コメントで説明されている@DanielFischerのように、スイッチを使用してmakefileの名前を(デフォルトの名前を使用しないように)伝えることができます。makefileMakefilecc gensine.c -o gensinemake-f

于 2012-11-10T23:04:30.910 に答える