我正试图用makefile编译和连接一个由4个.c文件和一个.h文件组成的项目。我在链接阶段遇到了一些问题,我似乎无法弄清楚问题出在哪里。我在下面列出了程序的主要结构,但没有列出实际代码(因为我对代码本身没有任何问题)。
这些文件是epsilon.c(项目主文件),有函数声明的funcs.h,以及有函数实现的diffClock.c,equal.c和nameDigit.c。这就是家庭作业。
如果我先运行make clean,一切似乎都能正常工作,但如果我更新源代码,然后简单地运行make,或从终端运行make -f makefile,则不能。值得一提的是,我可以从终端手动编译和链接所有的东西,而不需要makefile,所以我认为问题可能出在makefile上,或者我构建文件的方式。如果有任何帮助,我将不胜感激。
makefile看起来像这样。
CFLAGS = -fwrapv # This is a macro definition
LDFLAGS = -lm
OBJECTS = epsilon.o diffClock.o equal.o nameDigit.o funcs.h
default : out.txt
cat out.txt
out.txt : epsilon
./$< > $@
epsilon : $(OBJECTS) # epsilon depends on epsilon.o
$(CC) $? -o $@ $(LDFLAGS)
.PHONEY: clean
clean:
rm -f out.txt epsilon $(OBJECTS)
diffClock.c:
#include <time.h>
#include "funcs.h"
double diffClock(clock_t clock1, clock_t clock2)
// some code...
平等.c。
#include "funcs.h"
#include <math.h>
int equal(double a, double b, double tau, double epsilon){
// some code...
nameDigit.c:
#include <stdio.h>
#include "funcs.h"
void name_digit( int dig ){
// some code...
funcs.h:
#ifndef EPSILON_FUNCS_H
#define EPSILON_FUNCS_H
#include <time.h>
extern double diffClock(clock_t clock1, clock_t clock2);
extern int equal(double a, double b, double tau, double epsilon);
extern void name_digit( int dig );
#endif //EPSILON_FUNCS_H
最后epsilon.c只是由主函数组成。
#include <math.h>
#include <stdio.h>
#include <assert.h>
#include <limits.h>
#include <float.h>
#include "funcs.h"
int main(){
// some code...
return 0;
和终端输出。
gcc -fwrapv -c -o epsilon.o epsilon.c
gcc epsilon.o -o epsilon -lm # Now we link the object file to an output program ('-o') called epsilon.
/usr/bin/ld: epsilon.o: in function `main':
epsilon.c:(.text+0x90): undefined reference to `diffClock'
/usr/bin/ld: epsilon.c:(.text+0xd8): undefined reference to `diffClock'
/usr/bin/ld: epsilon.c:(.text+0x11e): undefined reference to `diffClock'
/usr/bin/ld: epsilon.c:(.text+0x1dd): undefined reference to `diffClock'
/usr/bin/ld: epsilon.c:(.text+0x225): undefined reference to `diffClock'
/usr/bin/ld: epsilon.o:epsilon.c:(.text+0x26b): more undefined references to `diffClock' follow
/usr/bin/ld: epsilon.o: in function `main':
epsilon.c:(.text+0x8b7): undefined reference to `name_digit'
collect2: error: ld returned 1 exit status
make: *** [makefile:37: epsilon] Error 1