我在这个程序中有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文件的任何引用?如何使其正常工作,以便如果我更改头文件,它会重新编译并实际使用新标题
感谢您的帮助!
答案 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
进行更改