代码之家  ›  专栏  ›  技术社区  ›  AndroidDev

编译:对的未定义引用

  •  2
  • AndroidDev  · 技术社区  · 11 年前

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

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

    文件:π.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退出状态 制造商: * [calcPi.o]错误1

    1 回复  |  直到 8 年前
        1
  •  3
  •   cHao Hammerite    11 年前

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

    您引用的pi()函数来自 计算Pi ,但它只被编译成 圆周率 ,所以您需要将其作为依赖项添加。

    我认为你想做的是创造 计算Pi 使用 计算Pi.o 圆周率 对象文件。

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