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

ファイル: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

4

1 に答える 1

3

まず第一に、piは本当に別のアプリケーションであると想定されていますか?

calcPiからpi()関数を参照していますが、これはpi.oにコンパイルされているだけなので、依存関係として追加する必要があります。

あなたがやりたいと思うのは、 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 *~
于 2013-03-12T19:26:07.667 に答える