0

小さな問題があり、この機能をテストするためにあらゆることを試しました。助けていただけますか? 「mutual_info.c」という名前の C ファイルを作成する必要があり、数学関数が必要です。ライブラリを含めてmakefileにリンクしましたが、それでも「ログへの未定義の参照」が表示されます...私のインクルードは次のようになります:(UbuntuでEclipseを使用しています)

#include <stdio.h>
#include <stdlib.h>
#include "sample.h"
#include "graph_or.h"
#include <math.h>

私のメイクファイルは次のようになります。

all:

    gcc -g amostra.c sample.h -o amostra.o

    gcc -g graph_or.c graph_or.h -o graph_or.o

    gcc -g graph_w.c graph_W.h -o graph_W.o

    gcc -g mutual_info.c -o mutual_info.o -lm

clean:
    rm *.o

何が起こっているのかまったくわかりません。コマンド「all」の前にLDFLAGSを定義して、次のようにしようとしました。

LDFLAGS= -lm
all:

    gcc -g amostra.c sample.h -o amostra.o

    gcc -g graph_or.c graph_or.h -o graph_or.o

    gcc -g graph_w.c graph_W.h -o graph_W.o

    gcc -g mutual_info.c -o mutual_info.o -lm

clean:
    rm *.o

しかし、それでもうまくいきません!! 誰かお願いします、これについて助けが必要です!ありがとう!

4

4 に答える 4

1

これを段階的に見ていきましょう。

makefileを作成する通常の方法は、ターゲットごとにルールを設定し、前提条件を使用することです。

thing: amostra.o graph_or.o graph_w.o mutual_info.o
    gcc -g amostra.o graph_or.o graph_w.o mutual_info.o -o thing -lm

mutual_info.o: mutual_info.c
    gcc -g -c mutual_info.c -o mutual_info.o -lm

amostra.o: amostra.c sample.h
    gcc -g -c amostra.c -o amostra.o

graph_or.o: graph_or.c graph_or.h 
    gcc -g -c graph_or.c -o graph_or.o

graph_w.o: graph_w.c graph_w.h
    gcc -g -c graph_w.c -o graph_w.o

mutual_info.o: mutual_info.c
    gcc -g -c mutual_info.c -o mutual_info.o -lm

thing(実行可能ファイルを呼び出す必要があり、意味するgraph_wのではなく、と推測しましたgraph_W。)

それはうまくいくはずですが、私たちはそれをよりきれいにすることができます。まず、自動変数を紹介します。

thing: amostra.o graph_or.o graph_w.o mutual_info.o
    gcc -g $^ -o $@ -lm

mutual_info.o: mutual_info.c
    gcc -g -c $< -o $@

amostra.o: amostra.c sample.h
    gcc -g -c $< -o $@

graph_or.o: graph_or.c graph_or.h 
    gcc -g -c $< -o $@

graph_w.o: graph_w.c graph_w.h
    gcc -g -c $< -o $@

mutual_info.o: mutual_info.c
    gcc -g -c $< -o $@

次に、これらのレシピが同じコマンドを使用していることがわかるので、パターンルールを作成します。

thing: amostra.o graph_or.o graph_w.o mutual_info.o
    gcc -g $^ -o $@ -lm

amostra.o: sample.h

graph_or.o: graph_or.h 

graph_w.o: graph_w.h

%.o: %.c
    gcc -g -c $< -o $@

これを試してみて、うまくいくかどうか教えてください。

于 2012-05-01T13:17:02.017 に答える
0

あなたがする 必要
が あり ます : o YourExecutableName amostra.o graph_or.o graph_w.o Mutual_info.o -lm



于 2012-05-01T10:57:51.223 に答える
0

これは、あなたが達成したいことの私の最善の推測を使用した一般的なメイクファイルです。*.c現在のディレクトリ内のすべてのファイルをコンパイルし、バイナリを作成しますmutual_info

RM := rm -f
CC := gcc
CFLAGS := -g
LDLIBS := -lm

SOURCES := $(wildcard *.c)
OBJECTS := $(SOURCES:%.c=%.o)
DEPS := $(SOURCES:%.c=%.d)
BINARY := mutual_info
FILES_TO_CLEAN := $(OBJECTS) $(DEPS)

.PHONY : all clean realclean

all : $(BINARY)

clean :
    $(RM) $(FILES_TO_CLEAN)

realclean : FILES_TO_CLEAN += $(BINARY)
realclean : clean

-include $(DEPS)

$(OBJECTS) : %.o : %.c
    $(CC) $(CFLAGS) -c -MMD -o $@ $<

$(BINARY) : $(OBJECTS)
    $(CC) -o $@ $^ $(LDLIBS)

それがあなたが望むものでない場合は明確にしてください。

于 2012-05-01T11:09:25.363 に答える
0

それは Makefile のスニペットですか? LDFLAG をエクスポートしてみましたか? このエラーは以前にも見たことがありますが、常に -lm フラグで修正されていました。

gcc -lm -o 何とか何とか.c

于 2012-05-01T10:31:02.917 に答える