2012-12-16 10 views
2

가능한 중복 :
Linker errors when compiling against glib…?수 없습니다

좋아, 나는이 중복 될 수 알지만, 어떤 다른 답변을 찾을 수없는 내 문제. Pintos를 설치하려고하는데 src/utils 디렉토리에서 'make'를 실행하면 'floor'에 대한 정의되지 않은 참조가 있다는 오류가 발생합니다. 나는 메이크를 확인하고 여기에 내가 가진 무엇 :

all: setitimer-helper squish-pty squish-unix 
# 2207718881418 

CC = gcc 
CFLAGS = -Wall -W 
LDFLAGS = -lm 
setitimer-helper: setitimer-helper.o 
squish-pty: squish-pty.o 
squish-unix: squish-unix.o 

clean: 
    rm -f *.o setitimer-helper squish-pty squish-unix 

나는 =이 있지만 도움이되지 않았다 -lm LIBS를 추가했습니다. 메이크업의

출력 :이 딜레마에

gcc -lm setitimer-helper.o -o setitimer-helper 
setitimer-helper.o: In function `main': 
setitimer-helper.c:(.text+0xbb): undefined reference to `floor' 
collect2: ld returned 1 exit status 
make: *** [setitimer-helper] Error 1 

모든 솔루션을?

+3

전체 컴파일러 명령은 보이지 않지만 라이브러리는 끝에 갈 필요가 있습니다. http://stackoverflow.com/questions/9966959/linker-errors-when-compiling-against-glib/9966989#9966989 – hmjd

+0

죄송합니다. 도움이된다고 생각하지 마십시오. 나는 단순히 make를 실행하면 오류가 발생합니다. – varagrawal

+0

make의 출력, 특히'gcc' 라인을 게시 할 수 있습니까? – hmjd

답변

5

원래 메이크 변수의 무리를 정의

CC = gcc 
# etc 

및 목록 일부 종속성이

setitimer-helper: setitimer-helper.o 
# etc 

있지만 RECIP이 없습니다 clean 규칙을 제외하고는 대상을 다시 만들 때 사용되는 정확한 명령을 제공합니다. 즉, 내장 된 암시 적 규칙이 사용됩니다.

$(CC) $(LDFLAGS) $^ $(LDLIBS) -o [email protected] 

setitemer-helper를 들어, 자동 변수가 관련 종속성을 사용하여 작성됩니다 :

$(CC) $(LDFLAGS) setitimer-helper.o $(LDLIBS) -o setitimer-helper 

와이에서 어떻게 볼 수 있습니다 예를 들면, 다음과 같은 기본 규칙이 사용됩니다 setitimer-helper 연결하는 나머지 변수들 - $(CC), $(LDFLAGS)$(LDLIBS) -을 채워서 여러분이 보았던 make의 출력을 제공합니다. 여러 사람들이 지적했듯이

, 당신은 floor() 같은 라이브러리 함수에 대한 참조를 만족시키기 위해 사용할 수 있도록 -lm 링크 명령의 에 간다 있는지 확인해야합니다. 현재 메이크 파일은 $(LDFLAGS)에서 -lm으로 설정되어 있지만 해당 변수는 링크 명령의 시작 부분에서 사용됩니다.

LDFLAGS을 옵션 (a.k.a.)에 사용할 수 있도록 기존의 변수가이 내장 규칙에 설정됩니다.(역사적으로) 링크 명령의 시작 부분에 있어야하는 "플래그")와 *.o 오브젝트 파일 다음에 지정해야하는 라이브러리에 대해 LDLIBS을 사용할 수 있습니다.

그래서 당신은, 당신은 정의 된 LDFLAGS 변수에서 -lm를 제거해야 사용중인 메이크의 관점에서이 문제를 해결, 대신 LDLIBS 또 다른 변수 정의를 추가합니다 : (

LDLIBS = -lm 

난 약간 과장되어 있습니다. 내장 규칙에도 $(TARGET_ARCH)$(LOADLIBES)이 포함되어 있지만 여기에는 관심이 없습니다.)

2

그것은 잘못된 순서로 컴파일되어 진행하는 방법은 다음과 같습니다

CC = gcc 
CFLAGS = -Wall -W 
LDFLAGS = -lm 

myprog: myprog.o more_code.o 
     ${CC} ${CFLAGS} myprog.o more_code.o ${LDFLAGS} -o myprog 

myprog.o: myprog.c 
     ${CC} ${CFLAGS} -c myprog.c 

more_code.o: more_code.c 
     ${CC} ${CFLAGS} -c more_code.c 

clean: 
     \rm myprog.o more_code.o myprog 

더 많은 정보를 원하시면

: http://www.physics.utah.edu/~p5720/rsrc/make.html

당신이 날은 원래 메이크의 측면에서 보여줄 수 있습니까? 내가 :)

CC = gcc 
CFLAGS = -Wall -W 
LDFLAGS = -lm 
OBJECTS = setitimer-helper.o squish-pty.o squish-unix.o 

all: setitimer-helper 

setitimer-helper: $(OBJECTS) 
     ${CC} ${CFLAGS} $(OBJECTS) ${LDFLAGS} -o setitimer-helper 

setitimer-helper.o: setitimer-helper.c 
     ${CC} ${CFLAGS} -c setitimer-helper.c 

squish-pty.o: squish-pty.c 
     ${CC} ${CFLAGS} -c squish-pty.c 

squish-unix.o: squish-unix.c 
     ${CC} ${CFLAGS} -c squish-unix.c 

을 시도 할 수 있습니다 그리고 당신은 메이크 새로운이기 때문에, 그것은 CFLAGS

에 -pedantic -Wextra를 추가하는 것이 좋습니다
+0

나는 당신을 못 보내고있다. makefile은 tarball의 일부로 나에게 주어졌다. 원래 메이크 파일의 관점에서 나를 보여줄 수 있습니까? – varagrawal

+0

@Varagrawal '$ (LD) $ (LDFLAGS) myprog.o -o myprog' 대신에'$ (LD) myprog.o $ (LDFLAGS) -o myprog'을 써서 라이브러리가 객체 목록 링크 할 파일. –

+0

그러나 그것은 Makefile이 원래 구조화 된 방식이 아니며 makefile을 처음 접했기 때문에 올바른 변경 방법을 찾을 방법이 없습니다. – varagrawal