我正在尝试创建一个简单的makefile。我有一个头文件:“guiBuilder.h
”。我有另一个将使用它的文件:“client.c
”。我正在使用的makefile是:
HEADERS = guiBuilder.h
default: program
program.o: client.c $(HEADERS)
gcc -c client.c -o client.o
program: client.o
gcc client.o -o Client
我在这里找到了makefile的代码:
我在运行时遇到此错误:
(。text + 0x20):对'main'的未定义引用 collect2:错误:ld返回1退出状态 Makefile:9:目标'程序'的配方失败 make:*** [program] Error 1
答案 0 :(得分:4)
make文件中的规则格式为:
target: dependency1 dependency2 etc
command to build target
target
是您要构建的文件的名称。这一行
program: client.o
gcc client.o -o Client
正在尝试构建名为program
的文件。但是,该命令不会创建名为program
的文件,而是创建一个名为Client
的文件。这不是您想象的问题,它只是意味着始终执行规则Client
是否是最新的。但是,您应该更改它,以便目标是您正在构建的文件。
Client: client.o
gcc client.o -o Client
顺便说一句,在大多数* nixes中,文件名区分大小写Client
,而client
是Linux上的不同文件。
该规则只有一个依赖关系:client.o
。很遗憾,您的make文件不知道如何构建client.o
- 没有名为client.o
的目标。
我推测您的错误原因是您有一个旧的client.o
悬挂在其中没有main()
功能。这就是链接(gcc
目标中的program
命令)失败的原因。
目标program.o
与目标program
存在同样的问题。您没有构建program.o
,而是正在构建client.o
。此目标需要更改为
client.o: client.c $(HEADERS)
gcc -c client.c -o client.o
很高兴您的Client
目标的依赖关系。
注意 make
规则的命令部分的缩进必须使用制表符完成。如果复制粘贴我的答案或任何其他答案,或链接问题中的答案,请确保您的缩进是制表符,而不是空格。
更新(test()
是未定义参考的问题)
如果guiBuilder.c
中的某个函数在guiBuilder.h
中有原型,则需要编译guiBuilder.c
并将其添加到链接阶段。
guiBuilder.o
的规则与client.o
guiBuilder.o: guiBuilder.c $(HEADERS)
gcc -c guiBuilder.c -o guiBuilder.o
然后,您需要添加guiBuilder.o
作为Client
Client: client.o guiBuilder.o
gcc client.o guiBuilder.o -o Client
您可能已经注意到,现在有两条规则用于创建除源和目标文件名称之外的相同文件的.o
文件。已接受的the question that you linked答案显示了如何修改make文件,因此您只需要定义一次规则。
答案 1 :(得分:0)
我建议您阅读GNU Make manual,以便更好地了解make
命令和makefile
的工作原理。
回答你的问题,简而言之,Makefile包含几个基本内容为target
,dependency
和recipe
的内容。以下列方式
target: dependency
recipe
当您运行make
命令时,它会搜索名为Makefile
或makefile
的文件,并开始解析目标和依赖关系并执行该目标的配方。
在你的makefile中,你想要创建名为program
的最终二进制文件,但你没有program.c
所以你的makefile应该如下所示:
HEADERS = guiBuilder.h
all: program
client.o: client.c $(HEADERS)
gcc -c client.c
program: client.o
gcc client.o -o program