2

我正在努力将多个文件编译成一个通用程序。我收到一个错误:

对“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);

文件:pic.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

4

1 回答 1

3

首先,pi真的应该是一个单独的应用程序吗?

您从calcPi引用 pi() 函数,但它只被编译成pi.o,因此您需要将其添加为依赖项。

我认为您想要做的是使用calcPi.opi.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 *~
于 2013-03-12T19:26:07.667 回答