【问题标题】:Error "no such file or directory" when compiling with Makefile使用 Makefile 编译时出现“没有这样的文件或目录”错误
【发布时间】:2018-03-05 22:30:36
【问题描述】:

我正在尝试使用 Makefile 来编译几个 .c 文件和几个自定义 .h 文件来制作一个可执行文件。但是在编译期间我收到错误“没有这样的文件或目录”的错误。

这是我的 Makefile,在编译过程中为什么忘记头文件的原因是否存在逻辑缺陷?

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

这是编译时错误:

socs@socsvm:~/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
socs@socsvm:~/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 文件在 bin、src 和 include 3 个文件夹之外。 bin 是我希望对象和可执行文件所在的位置,src 是 .c 文件所在的位置,而 .h 文件位于包含文件夹中的位置。

【问题讨论】:

  • 如果不查看您的所有文件和目录结构,我们就无法判断。据我们所知,这可能是一个错字。
  • 如果你显示完整的编译命令+错误也有帮助。
  • 您列出了两个头文件作为依赖项,但我在实际命令中没有看到任何标志来提供路径,因此可以实际找到这些文件。也就是说,CFLAGS 不包括 -I$(INC) 或类似内容。
  • 所以你的意思是编译器无法将头文件与实际的c文件本身连接起来?
  • 它有,前提是你给编译器正确的标志,和/或 c 文件有正确的头文件路径。也许你应该阅读在编译期间包含头文件

标签: c makefile compiler-errors compilation


【解决方案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)。

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

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

应该这样做。 (我可能对路径略有误解。如果仍然失败,请尝试 -I./include 的变体或 main 的相对路径:-I../include。但它应该是您发出命令的目录的路径,而不是相对于main.c.)

【讨论】:

  • 感谢您花时间和精力做出回应。不幸的是,我尝试过的所有变体(大约 4 或 5 个)似乎都不起作用。
  • @user8667363 先尝试gcc -Wall -g -std=c99 -c ./src/main.c -Iinclude。如果失败并出现其他错误,请显示该错误。
  • 这是完全相同的错误(我相信)唯一不同的可能是 ./src/main.c 和 -Iinclude 的顺序,我不确定这是否重要。但是,我已经更新了原始错误,因此您可以查看它。谢谢!!
  • @user8667363 #include "structDefns" 在您的源文件中应该是 #include "structDefns.h"。使用包含宏时,头文件需要全名,包括扩展名。
  • 令人惊讶的是,这样的事情怎么会被忽视,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
相关资源
最近更新 更多