2012-05-01 18 views
0

私は小さな問題があり、この機能をテストするためにすべてを試しました。私は "mutual_info.c"と呼ばれるCファイルを書く必要があり、数学的な関数が必要です。私は...ライブラリを含み、メイクファイルでそれをリンクされたが、それはまだ私に「ログインする未定義の参照」を与えてきた私は、次のようになり含まれています(私はUbuntuでEclipseを使用しています)math.hファイルとのリンク

#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 

私は何が起こっているのか全く見当がつかない、私も「すべて」コマンドの前に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 

しかし、それはまだ 動作しません!誰か、私はこれで助けが必要です!ありがとう!

+0

このメイクファイルは意味をなさない。 .oファイルを生成するには、 '-c'フラグが必要です。リンカオプションを指定する必要はありません(つまり、' -lm'は必要ありません)。すべての.oファイルをリンクするには、別個のGCC呼び出しが必要です。また、.hファイルを指定する必要もありません。 –

+0

ごめんなさい@OliCharlesworthさんがあなたの言っていることを理解できませんでしたか、より具体的なものか、メイクファイルのコードを教えてください。私はあなたがそれを使いたいと思うたびに数学ライブラリをリンクしなければならないと思った!ありがとう –

+0

コンパイルの典型的なパターンは 'gcc -c -o foo.o foo.c、gcc -c -o bar.o bar.o、gcc -o myApp foo.o bar.o -lm'のようなものです。 –

答えて

1

これをステップしてみましょう。

メイクファイルを書き込むための通常の方法は、各ターゲットのルールを持っている、と前提条件を使用することです:

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です。)

それはうまくいくはずですが、私たちはそれをより細かくすることができます。まず、我々はautomatic variablesを紹介:

thing: amostra.o graph_or.o graph_w.o mutual_info.o 
    gcc -g $^ -o [email protected] -lm 

mutual_info.o: mutual_info.c 
    gcc -g -c $< -o [email protected] 

amostra.o: amostra.c sample.h 
    gcc -g -c $< -o [email protected] 

graph_or.o: graph_or.c graph_or.h 
    gcc -g -c $< -o [email protected] 

graph_w.o: graph_w.c graph_w.h 
    gcc -g -c $< -o [email protected] 

mutual_info.o: mutual_info.c 
    gcc -g -c $< -o [email protected] 

その後、我々はこれらのレシピは、同じコマンドを使用していることがわかり、私たちはパターンルールを作成します。

thing: amostra.o graph_or.o graph_w.o mutual_info.o 
    gcc -g $^ -o [email protected] -lm 

amostra.o: sample.h 

graph_or.o: graph_or.h 

graph_w.o: graph_w.h 

%.o: %.c 
    gcc -g -c $< -o [email protected] 

は、この試してみて、それが動作するかどうかを教えて。

+0

ありがとうございました!私はそれを試しましたが、それでも私には同じエラーが出ます。何が間違っているのか分かりません:(他に何か試してみてください) –

+0

@ PL-RL、あなたはコードを減らすことができます。可能な限り削除し、すべての段階でテストして、同じエラーが発生していることを確認してください。できるだけ少ない行数のソースファイルを1つ取得してください。まだエラーが表示されます)、質問を編集してコードを表示してください。 – Beta

0

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

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

+0

あなたが言っていることは、gccの隣に-lmを変更することです。私はそれを試みたが、どちらもうまくいきませんでした... –

+0

-cソースをコンパイルしますが、リンクはありません。したがって、必要があります: gcc -c -o amostra.o amostra.c gcc -c -o graph_or.o graph_or.c gcc -c -o graph_w.o graph_w.c gcc -o YourExecutableName amostra.o graph_or .o graph_w.o -lm – Sirch

0

あなたがする必要があります。
のgcc -c -o amostra.o amostra.c
のgcc -c -o graph_or.o graph_or.c
GCC -c -o graph_w.o graph_w.c
のgcc -c -o mutual_info.o mutual_info.c
のgcc -o YourExecutableName amostra.o graph_or.o graph_w.o mutual_info.o -lm

+0

ありがとうございますが、mutual_infoファイル(数学ライブラリとリンクする必要があるファイル)はどうですか? –

+0

はい、その1つです:) – Sirch

+0

どちらも動作しません。 –

0

ここでは一般的なのですあなたが達成したいと思うものを私の最高の推測を使ってmakefile:それはすべてをコンパイルしますファイルを現在のディレクトリに作成し、バイナリ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 [email protected] $< 

$(BINARY) : $(OBJECTS) 
    $(CC) -o [email protected] $^ $(LDLIBS) 

あなたが望んでいないかどうかを明確にしてください。

関連する問題