编译:未定义的引用

时间:2013-03-12 19:19:38

标签: c makefile linker linker-errors undefined-reference

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

  

对'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

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 *~