创建一个makefile - (C)

时间:2017-10-09 09:17:35

标签: c makefile

我正在尝试创建一个简单的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的代码:

  

How do I make a simple makefile for gcc on Linux?

我在运行时遇到此错误:

  

(。text + 0x20):对'main'的未定义引用   collect2:错误:ld返回1退出状态   Makefile:9:目标'程序'的配方失败   make:*** [program] Error 1

2 个答案:

答案 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包含几个基本内容为targetdependencyrecipe的内容。以下列方式

target: dependency  
        recipe

当您运行make命令时,它会搜索名为Makefilemakefile的文件,并开始解析目标和依赖关系并执行该目标的配方。

在你的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