2012-02-18 104 views
3

好吧,經過3個小時的研究,我即將精神錯亂,所以我認爲是時候將它傳遞給一些新的眼睛。Makefile不使用包含/庫路徑?

CXXFLAGS  = -g -Wall 
OBJS   = main.o 
PROG   = test 
INCLUDES  = -I /usr/include/mysql -I /usr/local/include 
LIBS   = -L /usr/lib/mysql -l libmysqlclient.so.15.0.0 -L /usr/local/lib -l libmysqlpp.so.3.1.0 

all:   $(PROG) 

${PROG}:  $(OBJS) 
      $(CXX) $(INCLUDES) -o $(PROG) $(OBJS) $(LIBS) 

clean:;   $(RM) -f $(PROG) core *.o 

有一些錯誤的include路徑,因爲我得到,當它顯然不在/ usr/include中/ MySQL的存在mysql_version.h不存在錯誤。

檢查第一部分出來的輸出中的,它說

g++ -g -Wall -c -o main.o main.cpp 

這讓我覺得我已經格式化的Makefile文件出了問題(由於額外的空間和缺乏包括/庫路徑) 。然而,我已經看了許多關於Makefiles和g ++選項的手冊和文章,並且......沒有進展。

我認爲這應該是一個簡單的修復。請幫助(你感覺到我的絕望嗎?)。

另一方面,您是否認爲特別指定庫是必要的?我曾經在XCode中運行過這些東西,但我試圖將代碼遷移到我的Web服務器上...... Makefile已經停止了所有的進度,並且我認爲這是我應該學習的東西。

+0

在我的Mac上正常工作。雖然它抱怨使用Tab而不是空格(這是特別關注的)。對不起沒有更多的幫助:( – akhisp 2012-02-18 07:14:43

回答

10

在你的makefile中,你已經將你的include指令添加到了鏈接階段,而不是編譯階段。

線條

${PROG}:  $(OBJS) 
      $(CXX) $(INCLUDES) -o $(PROG) $(OBJS) $(LIBS) 

說通過調用$ {CXX}編譯器,使程序在$ {OBJS} $ {PROG}目標文件傳遞包含的文件夾(與其他參數一起)。相反,你的可變部分,這樣做:

INCLUDES  = -I /usr/include/mysql -I /usr/local/include 
CXXFLAGS  = -g -Wall ${INCLUDES} 
OBJS   = main.o 
PROG   = test 
LIBS   = -L /usr/lib/mysql -l libmysqlclient.so.15.0.0 -L /usr/local/lib -l libmysqlpp.so.3.1.0 

這樣你CXXFLAGS(它被用於編譯階段)現在應該領取您include指令。

+0

你是對的,我錯過了那部分,當我嘗試它。我只看鏈接階段。好點。 – akhisp 2012-02-18 07:21:34

+0

我認爲'-I'通常用於pre-編譯器步驟,所以它會更好地適合'CPPFLAGS',但'CXXFLAGS'也很好。 – 2012-02-19 00:26:49