2011-11-06 125 views
1

我試圖整理我的項目目錄如下的Makefile子目錄

外殼
| INC/[頭文件]
| OBJ/[目標文件]
| SRC/[源文件]
| Makefile文件
|可執行

編譯沒有在根文件夾中的一切錯誤,但我遇到了困難修改我的makefile,以適應不同的直接擁有一切法制前提。

這裏是我的makefile怎麼看不目錄

OBJS = shutil.o parser.o sshell.o 
HEADER_FILES = shell.h parser.h 
EXECUTABLE = sshell 
CFLAGS = -Wall 
CC = gcc 
#Create main executable 
$(EXECUTABLE): $(OBJS) 
    $(CC) -o $(EXECUTABLE) $(OBJS) 
#Create object files 
%.o: %.c 
$(CC) $(CFLAGS) -I. -c -o [email protected] $< 
$(OBJS) : $(HEADER_FILES) 

我已經嘗試添加目錄到定義(obj的/和INC /目錄)

OBJS = obj/shutil.o obj/parser.o obj/sshell.o 

而且修改的每一個實例%.o和%.c到obj /%.o和src /%。c

據我所知,一切都應該沒問題,但是當我從根目錄進行製作時,出現此錯誤

gcc -Wall -Iinc -c -o obj/shutil.o src/shutil.c 
src/shutil.c:8:23: fatal error: inc/shell.h: No such file or directory 
compilation terminated. 

任何人都可以找到我在這裏做錯了嗎?我一直在爲此掙扎好幾天。

+0

您是否嘗試添加到您的編譯標誌:'-I..'?我個人會將* .o編譯爲src的makefile,並在編譯的lib文件中構建最終結果。我不是說這是最好的,只是我如何去做。如果您想查看我的Makefiles示例,請參閱[這裏](https://github.com/ShabbyX/shCompiler) – Shahbaz

+0

我無法重現該錯誤,並且使用完全相同的命令。你能發佈你正在使用的實際makefile嗎?另外,你使用的是哪個版本的gcc? – Beta

+0

看起來像您將shutil.c更改爲#include「inc/shell.h」。把它改回「shell.h」,-Iinc應該把它拿起來。 – blueshift

回答

0

你的編譯器正在尋找inc/shell.h,它不應該。通常,源文件中不應包含任何與構建系統相關的路徑,但構建系統的細節應該通過編譯器標誌定義。

也就是說,源文件的src/shutil.c應該是這樣的:

#include "shell.h" 

和你的編譯器調用相同,與-Iinc經過包括路徑。

通過保持源文件的路徑,實現和安裝頭文件要簡單得多。

+0

這不完全是最佳做法。它不能很好地擴展(設想一個包含多個shell.h頭文件的項目)。頭文件目錄複製命名空間(以C爲前綴)比如「namespace_a/shell.h」,「namespace_b/shell.h」更好。 –

+0

@MaximYegorushkin:我同意,即使在這種情況下沒有任何頭文件目錄應該被稱爲「inc」。我認爲他會擁有inc中的邏輯子目錄。 – thiton

1

-I.更改爲-I${CURDIR}。前者將正在編譯的源目錄添加到包含路徑列表中,該目錄將爲shell/src。後者增加shell,這可能是你想要的。

你也可以看看Building multiple executables with similar rules的微型非遞歸構建框架。

0

好吧,它花了一些徹底的挫折,但我現在明白了。 我改變了我的定義在頂部包含文件的路徑,像這樣:

OBJS = obj/shutil.o obj/parser.o obj/sshell.o 
HEADER_FILES = inc/shell.h inc/parser.h 

而且似乎問題的關鍵是-I./inc,而不是-Iinc如我所料。

obj/%.o: src/%.c 
    $(CC) $(CFLAGS) -I./inc -c -o [email protected] $<