2011-08-11 72 views
8

我正在嘗試編譯此工具。下面是它的Makefile文件的開頭:在Makefile中找不到指向的庫文件

CC  = gcc 
CFLAGS = -Wall -O2 -D TRACES 
DFLAGS = -g -Wall -o0 
CPPFLAGS= $(INCLUDES:%=-I %) 
LDFLAGS = $(LIBRARIES:%=-L %) 
LDLIBS = $(USED_TOOLS:%=-l%) 

MY_FILES = 
INCLUDE_DIR  = ~/include 

TOOLBOX_INC  = $(INCLUDE_DIR)/tools 
TOOLBOX_LIB  = $(TOOLBOX_INC) 
USED_TOOLS  = std_io stringutils 
INCLUDES = $(TOOLBOX_INC) 
LIBRARIES = $(TOOLBOX_LIB) 

我也有〜/包括/工具,編譯後包括std_io.o,libstd_io.a,stringutils.o和libstringutils.a

我收到以下錯誤:

gcc -L ~/include/tools rank.o counterexample.o -lstd_io -lstringutils -o rank 
ld: library not found for -lstd_io 
collect2: ld returned 1 exit status 
make: *** [rank] Error 1 

我不確定是否沒有正確包含這些內容,以及爲什麼它沒有找到庫文件。

編輯:事實證明,我不小心留下了-L和-I選項之間的空間。另外,我猜想路徑必須擴大。現在正在工作,謝謝!

+1

你確定你的'〜'擴展到你的主目錄嗎?嘗試使用'INCLUDE_DIR'的完整路徑。 –

+0

它是否從命令行工作? – Beta

+0

你對'libstd_io.a'有正確的權限嗎? –

回答

12

問題是使用代字號來表示「主目錄」。只有當代字號是單詞中第一個非引號字符時,外殼纔會進行代字符擴展。 Makefile永遠不會做代字擴展。因此,在

gcc -L~/include ... 

進行波浪線擴展和gcc會尋找一個名爲「〜/包括」在當前目錄。但在

gcc -L ~/include ... 

確實進行波浪線擴展和gcc看到

gcc -L /usr/username/include ... 

,而不是如預期其工作。正確的做法是不要在主目錄中使用代字符擴展,而只需在Makefile中適當使用$ HOME,例如

INCLUDE_DIR  = $$HOME/include 
+1

謝謝你的回答。一些如何很難找到關於波浪擴展的這一點。 – szydan