2013-06-20 20 views
0

我工作的一個相當大的,雜亂的項目,我還沒有真正有時間來清理幾個庫文件和目標文件的靜態庫,我一直在負責提供它的API。我想要做的是將所有醜陋的東西包裝在一個靜態庫中,然後提供一個頭文件。鏈接到由使用一個頭文件

但是當試圖使用頭文件和庫生成一個可執行文件時,我收到了一堆「未定義的引用」錯誤。我想如果我提供了所有的頭文件,它會工作,但我真的不想這樣做。

眼下makefile看起來是(稍微改變爲簡單起見)是這樣的:

myprog.elf : libgiant_lib.a main.o 
    gcc -pg -o [email protected] main.o -lgiant_lib 

main.o : main.c 
    gcc -c $(CFLAGS) $(SOME_INCLUDES) $< -o [email protected] 

libgiant_lib.a : $(A_BUNCH_OF_LIBS) $(COUPLE_OF_OBJS) api.o 
    ar rcs [email protected] $^ 

api.o : api.c api.h 
    gcc -c $(CFLAGS) $(INCLUDES_FOR_BUNCH_OF_LIBS) $< -o [email protected] 

我檢查了libgiant_lib.a存檔,它似乎包含所有的庫和目標它應該文件。但是,連接它並不起作用。

我敢肯定,我失去了一些東西很明顯這裏...

+0

所以,我決定只將目標文件到歸檔相反,現在看來是打算工作。 – user1986698

回答

0

看來,我認爲你的包含文件可能有引用其它包含文件。所以,您需要提供一個標誌來指示這些包含文件的位置。我會建議爲

提供位置(包含所有的包含文件的目錄)INCL_DIR = /包括/ DIR /位置

,並使用-I標誌,包括它在編譯階段。例如,你的api.o規則將成爲

api.o: api.c api.h 
     gcc -c $(CFLAGS) -I$(INCL_DIR) $(INCLUDES_FOR_BUNCH_OF_LIBS) $< -o [email protected] 
+0

這實際上正是'$(INCLUDES_FOR_BUNCH_OF_LIBS)'是(我的壞,應該有更好的命名)。我從來沒有將頭文件指定給gcc,只是在哪裏可以找到它們。也許我應該? – user1986698

+0

而'api.o'就這樣構建得很好。 – user1986698

+0

你也必須爲main.o做同樣的事情。 – unxnut