C - Makefile在头文件更改后编译,但更改不生效

时间:2017-04-16 20:23:52

标签: c gcc makefile linker header-files

我在这个程序中有3个文件,lab4.c,functions.h,functions.c

lab4.c调用函数multiply(),其原型在functions.h中,并在functions.c中定义。然后使用函数c中的多个其他函数。我所拥有的唯一包括在lab4.c中包括functions.h,我还需要更多吗?我遇到的问题如下所述

lab4:

#include <stdio.h>
#include <stdlib.h>
#include "functions.h"
int main(void) {
...
}

functions.h:

#ifndef FUNCTIONS
#define FUNCTIONS

void divideByPowerOf2(unsigned int* a, int power);
void multiplyByPowerOf2(unsigned int* a, int power);
...
#endif /* FUNCTIONS */

functions.c:

void divideByPowerOf2(unsigned int* a, int power){
    *a >>= power;
}
void multiplyByPowerOf2(unsigned int* a, int power){
    *a <<= power;
}
...

目前,我的makefile如下所示:

生成文件:

#Makefile

all: lab4

lab4: lab4.o functions.o functions.h
    gcc -Wall -o lab4 lab4.o functions.o

lab4.0: lab4.c
    gcc -c lab4.c

functions.o: functions.c
    gcc -c functions.c

现在这将在我更改头文件时重新编译,但更改实际上不会生效。例如,如果我将头文件更改为

#ifndef FUNCTIONS
#define FUNCTIONS

void divideByPowerOf2(unsigned int* a, int power);
//void multiplyByPowerOf2(unsigned int* a, int power);
...
#endif /* FUNCTIONS */

该程序仍然可以正常工作。我假设我可能搞乱了将文件与包含和所有内容联系起来,因为这通常会让我感到困惑。例如,functions.c需要引用什么吗? function.h是否需要对.c文件的任何引用?如何使其正常工作,以便如果我更改头文件,它会重新编译并实际使用新标题

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

首先,这里有一个错字:

lab4.0: lab4.c

应该是

lab4.o: lab4.c

然后,您的function.h应该在source =&gt;上对象依赖行,而不是对象=&gt;可执行行,否则,如果更改.h文件,它只是重新链接而不重建.o文件:它不会改变任何内容。

此外,使用-Wall很方便,但是在编译文件时必须使用它,而不是在链接可执行文件时使用它,否则您将错过实际的编译警告(在链接阶段-Wall只是非常无用的)。

例如,-Wall标志会向您显示注释原型会生成一个&#34;隐式声明&#34;警告(可能导致函数的调用/返回值不正确)。使用-Werror会更有效,它会将警告变为错误,因此您无法忽略警告。

这里是你的makefile的样子:

all: lab4

CFLAGS = -Wall

lab4: lab4.o functions.o
    gcc -o lab4 lab4.o functions.o

lab4.o: lab4.c functions.h
    gcc $(CFLAGS) -c lab4.c

functions.o: functions.c functions.h
    gcc $(CFLAGS) -c functions.c

请注意,如果您只有2个源文件并且它们足够小,您甚至可以通过运行来使用make文件:

gcc -Wall -o lab4 lab4.c functions.c

在脚本中。如果您有太多/大的源文件,那就不适应了,因为它每次都会重建所有内容。

答案 1 :(得分:-1)

我总是这样,标题更改在重新编译时不会生效,所以你必须删除.o输出然后重新编译,或者在makefile的末尾添加这样的东西,这样你就可以输入{{1并为你完成它:

make clean

一旦你在makefile的末尾有了这个,你就可以clean: rm *.o 进行更改