编译多个.c和.h文件
我的程序分为6个文件:编译多个.c和.h文件,c,struct,makefile,compilation,include,C,Struct,Makefile,Compilation,Include,我的程序分为6个文件: h(包含基本列表结构信息和函数原型) 清单c(包含上述内容的实施) search_tree.h(包含基本树结构信息和函数原型) search_tree.c(包含上述的实现,包括list.h) search.h(同样是函数的原型) search.c(aobve功能的实现) main.c(需要以上所有功能才能运行) 我似乎无法弄清楚makefile应该是什么,我尝试了下面的一个,但它不起作用,并且我得到了未实现的结构和函数的错误 myprog: list.o search_t
myprog: list.o search_tree.o search.o main.o
gcc -o myprog list.o search_tree.o search.o main.o
list.o: list.c list.h
gcc -c list.c
search_tree.o: search_tree.c search_tree.h
gcc -c search_tree.c
search.o: search.c search.h
gcc -c search.c
main.o: search.h search_tree.h list.h hash_table.h
gcc -c main.c
您不需要为每个文件显式地创建规则-
make
有许多规则已经完成了您所需的90%。您的makefile可以简单到
CC=gcc
CFLAGS=-std=c11 -pedantic -Wall -Werror # my usual compiler flags
LDFLAGS= # specify additional libraries and library search paths here
myprog: main.o search.o search_table.o list.o
$(CC) -o $@ $(LDFLAGS) $?
clean:
rm -rf myprog *.o
已经有一个隐式规则从.c
文件生成.o
文件,因此您不需要创建自己的文件,除非您希望覆盖默认值,即
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
%.o:%.c
$(CC)-c$(CFLAGS)$(CPPFLAGS)$<-o$@
您确实需要显式的
myprog
规则将对象文件链接到可执行文件中,因为可执行文件名与任何源文件名或对象文件名都不匹配$@
扩展到目标名称,myprog
,$?
扩展到目标的先决条件列表(即对象文件)$您不需要为每个文件显式创建规则-make
有许多规则已经完成了您所需的90%。您的makefile可以简单到
CC=gcc
CFLAGS=-std=c11 -pedantic -Wall -Werror # my usual compiler flags
LDFLAGS= # specify additional libraries and library search paths here
myprog: main.o search.o search_table.o list.o
$(CC) -o $@ $(LDFLAGS) $?
clean:
rm -rf myprog *.o
已经有一个隐式规则从.c
文件生成.o
文件,因此您不需要创建自己的文件,除非您希望覆盖默认值,即
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
%.o:%.c
$(CC)-c$(CFLAGS)$(CPPFLAGS)$<-o$@
您确实需要显式的myprog
规则将对象文件链接到可执行文件中,因为可执行文件名与任何源文件名或对象文件名都不匹配$@
扩展到目标名称,myprog
,$?
扩展到目标的先决条件列表(即对象文件)<代码>$类似于John的建议,修复了一个小错误($^
自动变量而不是$?
),自动化程度更高(通配符
用于搜索C源文件),并为头文件添加了依赖项($(OBJS):%.o:%.h
静态模式规则):
类似于John的建议,修复了一个小错误($^
自动变量而不是$?
),自动化程度更高(通配符
,用于搜索C源文件),并且添加了头文件的依赖项($(OBJS):%.o:%.h
静态模式规则):
.h
文件未编译。“不起作用”不是有效的问题描述。您有两个搜索规则。o其中一个应该是搜索树。o如果所有文件都在同一个目录中,您可以键入:gcc-o myprog*.c
dir@odin是的,我在复制代码时很糟糕,我现在正在编辑它。你怎么确定这是一个生成文件问题?你试过全部手工编译吗?如果它抱怨找不到结构,我觉得你好像忘记了#include
某处.h
文件没有编译。“不起作用”不是有效的问题描述。您有两个搜索规则。o其中一个应该是搜索树。o如果所有文件都在同一个目录中,您可以键入:gcc-o myprog*.c
dir@odin是的,我在复制代码时很糟糕,我现在正在编辑它。你怎么确定这是一个生成文件问题?你试过全部手工编译吗?如果它抱怨找不到结构,我觉得你好像忘记了一个#include
somewhere很好的答案,很多帮助。谢谢!回答得很好,有很多帮助。谢谢!