2012-12-16 65 views
2

可能重複:
Linker errors when compiling against glib…?無法使用LIB makefile文件鏈接數學

好吧,我知道這可能是重複的,但我找不到任何其他的回答我問題。 我試圖安裝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 

我試着添加LIBS = -lm但沒有幫助。

輸出之作:

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

你原來的Makefile定義一組變量

CC = gcc 
# etc 

並列出了一些依賴

setitimer-helper: setitimer-helper.o 
# etc 

,但沒有任何RECIP es除了clean規則外,給出了用於重製目標的確切命令。這意味着將使用內置的隱式規則;例如,鏈接setitimer-helper以下內置的規則將被使用:

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

對於setitemer-helper,自動變量被分配使用相關的依賴性:

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

,並從這裏就可以看出如何剩下的變量 - $(CC)$(LDFLAGS)$(LDLIBS) - 被填充以提供您看到的make的輸出。

各種人都注意到,你需要確保-lm去在鏈接命令的,以便它可以被用來滿足像floor()庫函數的引用。目前,您的makefile文件將$(LDFLAGS)設置爲-lm,但該變量用於鏈接命令的開頭。

常規變量在此內置規則中設置,因此LDFLAGS可用於選項(也稱爲選項)。「flags」)(歷史上)需要位於鏈接命令的開頭,LDLIBS可用於需要在*.o目標文件之後指定的庫。

因此,要解決這個問題在你使用,你需要從被定義的變量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

你能告訴我在原來的makefile文件的條款? 我可以試試:)

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 

而且因爲你是新來的Makefile,它的加入-Wextra -pedantic到CFLAGS

一個好主意
+0

我不明白你的意思。 makefile是作爲tarball的一部分提供給我的。你可以根據原始的makefile顯示我嗎? – varagrawal

+0

@Varagrawal而不是'$(LD)$(LDFLAGS)myprog.o -o myprog',寫入'$(LD)myprog.o $(LDFLAGS)-o myprog',以便這些庫位於對象列表之後要鏈接的文件。 – 2012-12-16 11:45:55

+0

但這不是Makefile最初構造的方式,而且由於我是makefile的新手,我不知道如何進行正確的更改。 – varagrawal