我尝试使用Makefile来启动我的C程序,命令行如下CCD_ 1。我在头文件和build.c(使用<dirent.h>
的那个(中都声明了#include <dirent.h>
。
不知怎的,它无法从-std=c11
或-std=c99
开始,它将返回一个错误:
错误:"DT_DIR"未声明(此函数中首次使用(
(均为c11
或c99
(,如果我在Makefile中包含其中一个参数。
如果我把它取下来,它会很好地工作。既然-std=c11 -Wall -Werror
是强制性的,有什么办法解决这个问题吗?
关于未定义的DT_DIR,我不能使用-D_BSD_SOURCE
,因为它已被弃用。
Makefile
PROJECT = test
HEADERS = $(PROJECT).h
OBJECT = build.o
C11 = cc -std=c11
CFLAGS = -Wall -Werror
$(PROJECT):$(OBJECT)
$(C11) $(CFLAGS) -o $(PROJECT) $(OBJECT) -lm
$(OBJECT):%.o: %.c $(HEADERS)
$(C11) $(CFLAGS) -c $<
cc -std=c11 -Wall -Werror -c build.c
0的内容不应影响结果,因为如果没有-std=c11
,它仍然可以工作。
我不知道它是否能解决您的问题,但我建议您简化Makefile
一些,以依赖隐式规则来编译和构建您的项目。
只列出Makefile
中的标志、选项和依赖项,让make
处理其余内容:
# Flags for the compiler CC when building object files
CFLAGS = -std=c11 -Wall -Werror
# Flags for the linker LD when building the executable program
LDFLAGS = -std=c11
# Libraries for the linker to link with
LBLIBS = -lm
# List dependencies
test: build.o
build.o: build.c test.h
这将从源文件build.c
创建对象文件build.o
,并依赖于test.h
头文件。然后它将链接build.o
对象文件以创建test
可执行程序,与-lm
链接。