2012-05-01 1 views
0

작은 문제가 있습니다.이 함수를 테스트하기 위해 모든 것을 시도했습니다. 제발 도와주세요. "mutual_info.c"라는 C 파일을 작성해야하며 수학 함수가 필요합니다. 내가 ... 라이브러리를 포함 메이크 파일에 링크 된,하지만 여전히 나에게 "로그 정의되지 않은 참조"를 제공 한 내는 다음과 같이 포함되어 있습니다 (I 우분투에 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입니다.)

정상적으로 작동하지만 더 잘 만들 수 있습니다.

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] 

그런 다음 우리는 이러한 조리법이 같은 명령을 사용하여 볼, 그래서 우리는 패턴 규칙을 만들 : 처음에 우리는 automatic variables을 소개

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, 네, 코드를 줄일 수 있습니다. 가능한 한 많이 제거하고 모든 단계에서 테스트하여 동일한 오류가 계속 발생하는지 확인하십시오. 가능한 경우 몇 줄의 소스 파일 하나만 가져와야합니다. 더 간단하게 만들 수없는 경우 (및 여전히 오류가 발생 함) 질문을 수정하고 코드를 표시하십시오. – Beta

0

Makefile의 스 니펫일까요? Hav 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

예, 그 중 하나 : – 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) 

원하시는 것이 맞는지 분명하게 말하십시오.