2013-10-13 107 views
3

我已經創建了一個.h頭文件,實現並創建了.a靜態庫文件,它們都在目錄中,比如/home/data/folder1如何使用makefile從C中的其他目錄中包含靜態庫和.h文件?

我有另一個.c文件,它將使用鏈接.h頭文件和.a庫文件。但是,.c文件位於目錄/home/data/folder2中。

我該怎麼寫Makefile(它也位於/home/data/folder2)?另外,我是否應該在要編譯的.c文件中包含myheader.h?這是我到目前爲止,但沒有工作:

LIBB = -L/home/data/folder1/libmylib.a 

HEADER = -L/home/data/folder2/myheader.h 

main: main.o 
    gcc $(HEADER) $(LIBB) $< -o [email protected] 

main.o: main.c 
    gcc -c main.c 

.PHONY: clean 

clean: 

    rm -f *.o *.~ a.out main 

任何幫助將不勝感激,在此先感謝!

回答

6

包含來自非標準目錄的頭文件和庫很簡單。

你有路徑包含庫和包含標題的一個目錄,所以我們存儲這些變量:

LIBB = /home/data/folder1 
LIBINCLUDE = /home/data/folder2 

現在GCC需要知道到哪裏找頭,所以我們只需將其包含在CFLAGS中即可。鏈接器(不是編譯器)需要知道到哪裏尋找庫,因此我們可以添加到LDFLAGS

CFLAGS += -I$(LIBINCLUDE) 
LDFLAGS += -L$(LIBB) 

它將使用CFLAGSLDFLAGS如果自動不顯式運行GCC。

但對於鏈接步驟,它需要知道所需要的庫,所以:

LDFLAGS += -static -lmylib 

連接器將尋找libmylib.a所有在LDFLAGS-L選項命名的目錄。

由於您的規則mainmain.o是明確的,改變他們像這樣(但一定要使用標籤,而不是4位):

main: main.o 
    gcc $(LDFLAGS) $< -o [email protected] 

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

謝謝!但是呃......如果我的頭文件和庫位於同一個目錄中,而另一個文件位於另一個文件中,該怎麼辦?我應該做同樣的事情嗎?同時,是否必須在我的.c文件中編寫#include「myheader.h」?謝謝! – CTownsend

+0

你*可能*必須添加'-I.'和'-L.',但是過程完全相同。但是'main'和'main.o'的規則都可以放棄'gcc'的行,它會做正確的事情。另外,是的,你*需要在'.c'文件中有一個適當的'#include'指令。 – greyfade

相關問題