编译: undefined reference to

标签 c makefile linker linker-errors undefined-reference

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

undefined reference to '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”的 undefined reference collect2:错误:ld 返回 1 退出状态 make: * [calcPi.o] 错误 1

最佳答案

首先,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 *~

关于编译: undefined reference to,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15370214/

相关文章:

linux-kernel - ld-linux.so* 本身是如何链接和加载的?

c++ - 在 C++ 中循环目录结构时给定名称是文件或目录

c - 结构体指针和内存位置

c - Scanf() 不等待整数输入

Makefile(不区分大小写的目标)

makefile - 制作文件警告,覆盖目标命令

android - 从源代码 : make: no rule to make target *. 构建 CyanogenMod,*.so 需要

c++ - 这两个字符串有什么区别?

在C文件中执行嵌入式lua编译错误

gcc - 使用链接器映射内存