2017-09-25 296 views
-1

我想使用一个Makefile来编译几个.c文件和一对夫妇的定制.h文件,使一个可执行文件编译时。然而在编译im时收到错误的错误“没有这样的文件或目录”。错误“没有这样的文件或目录”与Makefile文件

这里是我的Makefile中,有没有逻辑可能的漏洞,为什么头文件在编译过程中被遗忘?

错误的$(BIN)main.o规则期间发生在编译的第21行。

这是编译时错误:

[email protected]:~/Desktop/Programs/CIS2520/root$ make 
gcc -Wall -g -std=c99 -c -Iinclude -c ./src/main.c 
./src/main.c:4:23: fatal error: structDefns: No such file or directory 
#include "structDefns" 
        ^
compilation terminated. 
makefile:21: recipe for target 'bin/main.o' failed 
make: *** [bin/main.o] Error 1 
[email protected]:~/Desktop/Programs/CIS2520/root$ 

这是生成文件:

CC = gcc 
CFLAGS = -Wall -g -std=c99 -Iinclude 

BIN = ./bin/ 
SRC = ./src/ 
INC = ./include/ 

$(BIN)main:  $(BIN)main.o $(BIN)book.o $(BIN)store.o $(BIN)boardGame.o 
     $(CC) -o $(BIN)main $(BIN)main.o $(BIN)book.o $(BIN)store.o 
$(BIN)boardGame.o 

$(BIN)book.o: $(SRC)book.c $(INC)structDefns.h $(INC)funcDefns.h 
     $(CC) $(CFLAGS) -c $(SRC)book.c 

$(BIN)boardGame.o:  $(SRC)boardGame.c $(INC)structDefns.h $(INC)funcDefns.h 
     $(CC) $(CFLAGS) -c $(SRC)boardGame.c 

$(BIN)store.o: $(SRC)store.c $(INC)structDefns.h $(INC)funcDefns.h 
     $(CC) $(CFLAGS) -c $(SRC)store.c 

$(BIN)main.o: $(SRC)main.c $(INC)structDefns.h $(INC)funcDefns.h 
       $(CC) $(CFLAGS) -c $(SRC)main.c 

至于文件目录,make文件是3个文件夹,垃圾桶,SRC和外包括。 bin是我想要的对象和可执行文件,src是.c文件所在的位置,.h文件位于include文件夹中。

+0

如果没有看到所有的文件和目录结构,我们无法确定。据我们所知,这可能是一个错字。 – Evert

+0

如果您显示完整的编译命令+错误,它也会有所帮助。 – Evert

+0

您将两个头文件列为依赖项,但在实际命令中没有看到任何标志来提供路径,因此可以实际找到这些文件。也就是说,CFLAGS不包括-I $(INC)或类似的。 – Evert

回答

1

从编译命令,错误和错误给出的源代码行:

gcc -Wall -g -std=c99 -c ./src/main.c 
./src/main.c:4:23: fatal error: structDefns: No such file or directory 
#include "structDefns" 

它表明gcc找不到包含文件。它期望它位于与main相同的目录中,但是你的Makefile显示它在./include(或甚至相对于main的../include)中生效。

用正确的路径使用-I标志gcc在一起。您可以将其与其他CFLAGS一起设置:

CFLAGS = -Wall -g -std=c99 -Iinclude 

应该这样做。 (我可能是与路径稍微弄错如果仍然失败,请尝试-I./include或相对路径的变化,以主:。-I../include但它应该是从那里发出的命令,而不是相对于main.c的目录路径)

+0

我很欣赏响应的时间和精力。不幸的是,我尝试的所有变化(大约4或5)都没有发挥作用。 – user8667363

+0

@ user8667363首先尝试'gcc -Wall -g -std = c99 -c ./src/main.c -Iinclude'。如果失败并出现其他错误,请显示该错误。 – Evert

+0

这是完全相同的错误(我相信)唯一不同的可能是./src/main的顺序。C和-I包括,我不知道这是否重要。但是,我更新了原始错误,因此您可以查看它。谢谢!! – user8667363

相关问题