2015-09-30 56 views
-1

UPDATEÇ未定義參照功能:發現這個問題。這是我的一個錯誤,與製作無關。我編輯了文件以刪除預處理器條件並對其進行了修改。GNU使庫包括

我試圖編譯使用一個makefile來處理包括由測試使用的功能文件庫的創建一個測試程序。當試圖做出最終的可執行文件時,我收到一個'未定義的引用'錯誤。以下是我的makefile和結果輸出。我試過在makefile中切換文件和操作的順序,但都導致失敗。這導致我相信我錯過了一些關鍵組件,而不需要重新排序我的操作。

我運行RHEL 4,如果該事項。執行後

CC=gcc 
CFLAGS=-Wall 
LDFLAGS=-lm 
AR=ar 

OBJ = \ 
    test.o \ 
    disk_alloc.o \ 
    stringtools.o \ 
    path.o \ 
    xxmalloc.o 

LIB = libtest.a 
PROG = test 
TAR = $(LIB) $(PROG) 

all: $(TAR) 

libtest.a: $(OBJ) 
    $(AR) -rv $(LIB) $(OBJ) 
    ranlib $(LIB) 

$(PROG): 
    $(CC) $(CFLAGS) $(LIB) -o [email protected] 

clean: 
    rm -f $(OBJ) $(TAR) 

.PHONY: all clean 

# vim: set noexpandtab tabstop=4: 

輸出使:

gcc -Wall -c -o test.o test.c 
gcc -Wall -c -o disk_alloc.o disk_alloc.c 
gcc -Wall -c -o stringtools.o stringtools.c 
gcc -Wall -c -o path.o path.c 
gcc -Wall -c -o xxmalloc.o xxmalloc.c 
ar -rv libtest.a test.o disk_alloc.o stringtools.o path.o xxmalloc.o 
ar: creating libtest.a 
a - test.o 
a - disk_alloc.o 
a - stringtools.o 
a - path.o 
a - xxmalloc.o 
ranlib libtest.a 
gcc -Wall libtest.a -o test 
libtest.a(test.o): In function `disk_alloc_test_empty': 
test.c:(.text+0x5f): undefined reference to `disk_alloc_create' 
test.c:(.text+0x81): undefined reference to `disk_alloc_delete' 
libtest.a(test.o): In function `disk_alloc_test_read_write': 
test.c:(.text+0x17b): undefined reference to `disk_alloc_create' 
test.c:(.text+0x1e0): undefined reference to `disk_alloc_delete' 
libtest.a(test.o): In function `disk_alloc_test_nested': 
test.c:(.text+0x30a): undefined reference to `disk_alloc_create' 
test.c:(.text+0x372): undefined reference to `disk_alloc_create' 
test.c:(.text+0x410): undefined reference to `disk_alloc_delete' 
test.c:(.text+0x426): undefined reference to `disk_alloc_delete' 
collect2: ld returned 1 exit status 
make: *** [test] Error 1 
+2

disk_alloc.c'中的'disk_alloc_create'和'disk_alloc_delete'?你可以在'disk_alloc.o'文件和'libtest.a'庫中看到這些符號嗎?你也意識到RHEL 4是**非常**老,並且充滿** gaping **安全漏洞,對吧? (除了作爲在這一點完全沒有維護。) –

+0

不考慮大洞的通話,是這兩個函數都在disk_alloc.c和存在於庫中。 – Duder

+0

@伊坦 - 賴斯納望着disk_alloc.o文件,我竟然發現,disk_alloc_create和disk_alloc_delete符號都沒有找到,但他們是在圖書館。造成這種差異的原因是什麼?如何解決? – Duder

回答

2

你忘了鏈接對象文件$(OBJ),你可能不需要任何$(LIB),所以更換

$(PROG): 
    $(CC) $(CFLAGS) $(LIB) -o [email protected] 

$(PROG): $(OBJ) 
    $(CC) $(CFLAGS) $^ -o [email protected] 

如果您絕對想要使用庫,則需要鏈接一個目標文件,其外部提供main。大概保持$(LIB)但是從OBJ定義中刪除test.o,並做

$(PROG): test.o $(LIB) 
    $(CC) $(CFLAGS) $^ -o [email protected] 

瞭解更多關於automatic variablesmake

事實上,你應該升級你的Linux發行版(使用RHEL4是不是合理的這些天)。如果可能的話,在2015年,使用一個與GCC 5 & make 4. ...還可以考慮使用remake來調試Makefile -s。另請參閱this答案中的鏈接(包括短片Makefile-s的示例)

順便說一句,靜態庫通常已經過時,在您的情況下,它可能不值得擁有一個庫(甚至是共享庫)。如果你真的想要一個,請分享它,並閱讀Program-Library-HowTo & Drepper的論文:How to Write a Shared Library

+0

感謝您的快速回復。不幸的是,這爲庫中的所有函數產生了一堆「多重定義」錯誤,並且在命令結束時仍然存在「未定義引用」錯誤。我可以給你的任何其他信息? – Duder

+0

OP正在鏈接'libtest.a'庫,因此不需要單個對象文件。 –

+0

此答案仍然無法解決源自disk_alloc_create和disk_alloc_delete的'未定義引用'錯誤。我已經刪除了對庫的引用,只是使用了對象文件以及僅刪除test.o並使用上述建議單獨編譯。兩者都產生相同的結果。看到disk_alloc.o文件中找不到disk_alloc_create和disk_alloc_delete,這導致我相信在那裏出了問題,但我不知道是什麼。 – Duder