我正在努力将多个文件编译成一个通用程序。我收到了一个错误:
对'pi'的未定义引用
这是我的代码和Makefile的框架。我究竟做错了什么?谢谢!
文件:calcPi.c
#include <stdlib.h>
#include <stdio.h>
#include <sched.h>
#include <string.h>
#include "pi.h"
int main(int argc, char* argv[]) {
long iterations = 1000000;
int policy = 2;
int numChildren = 3;
pi(iterations, policy, numChildren);
return 0;
}
档案:pi.h
void pi(long iterations, int policy, int numChildren);
档案:pi.c
#include "pi.h"
void pi(long iterations, int policy, int numChildren) {
//lots of code here
}
我正在使用Makefile编译它:
CC = gcc
CFLAGS = -c -g -Wall -Wextra
LFLAGS = -g -Wall -Wextra
all: calcPi pi
calcPi: calcPi.o
$(CC) $(LFLAGS) $^ -o $@ -lm
pi: pi.o
$(CC) $(LFLAGS) $^ -o $@ -lm
calcPi.o: calcPi.c
$(CC) $(CFLAGS) $<
pi.o: pi.c
$(CC) $(CFLAGS) $<
clean:
rm -f pi calcPi
rm -f *.o
rm -f *~
编辑:响应整个错误消息的请求:
在功能'main'中 calcPi.c:55:对'pi'的未定义引用 collect2:错误:ld返回1退出状态 make: * [calcPi.o]错误1
答案 0 :(得分:3)
首先, pi 真的应该是一个单独的应用程序吗?
您从 calcPi 引用pi()函数,但它只被编译为 pi.o ,因此您需要将其添加为依赖项。< / p>
我认为您想要做的是使用 calcPi.o 和 pi.o 目标文件创建 calcPi 。
CC = gcc
CFLAGS = -c -g -Wall -Wextra
LFLAGS = -g -Wall -Wextra
all: calcPi
calcPi: calcPi.o pi.o
$(CC) $(LFLAGS) $^ -o $@ -lm
calcPi.o: calcPi.c
$(CC) $(CFLAGS) $<
pi.o: pi.c
$(CC) $(CFLAGS) $<
clean:
rm -f calc
rm -f *.o
rm -f *~