0

いくつかの関数のプロトタイプを含むカスタム ヘッダー ファイル example.h があります。私が実装した.Cファイルexample.cがあり、これは「インクルード」(#include "example.h")し、example.hにプロトタイプを持つ関数の実装を持っています。これで、example.h でプロトタイプ化され、example.c で定義された関数を呼び出す別の関数 test.c ができました。

私のメイクファイルは次のとおりです

test: test.o
    gcc -o test -g test.o

test.o: test.c example.c example.h  
    gcc -g -c -Wall test.c
    gcc -g -c -Wall example.c

clean:
    rm -f *.o test

example.c で定義されている関数について、次のメッセージが表示されます。

ファイル内の未定義の最初の参照シンボル

function1 test.o

function2 test.o

function3 test.o

function4 test.o

ld: fatal: シンボル参照エラー。テストする出力が書き込まれません

collect2: ld が 1 つの終了ステータスを返しました

*エラーコード 1

make: 致命的なエラー: ターゲット `test' のコマンドが失敗しました

どんな助けでも大歓迎です。

4

3 に答える 3

2
%.o: %.c
    gcc -c -g -o $@ $^

test: test.o example.o
    gcc -o -g $@ $^

%.o: %.cこれは、すべての*.oファイルがファイルからの同等のものから構築される必要があることを意味しcます。

test.oはから構築する必要がtest.cあり、から構築するexample.o必要がありますexample.c

于 2013-02-01T08:35:24.340 に答える
1

まず、実行可能ファイルを生成するときに example.o ファイルを含める必要がありますgcc -o test example.o test.o。次に、ターゲット test.o に対して記述した依存関係が正しくありません。次のように分割する必要があります。

test: test.o example.o
    gcc -o test test.o example.o
test.o: test.c
    gcc -c -Wall test.c
example.o: example.c
    gcc -c -Wall example.c

次に、変数を使用して、オブジェクト ファイルの名前、リンカー/コンパイラなどに渡したいフラグを格納することを検討してください。これにより、作業がずっと楽になります。

于 2013-02-01T08:48:48.310 に答える
0

test.o: test.c example.c example.h
gcc -g -c -Wall test.c gcc -g -c -Wall example.c

あなたのコードに従って、test.oターゲットはtest.c example.c example.hターゲットを呼び出していますが、これは私には見えません。

于 2013-02-01T08:50:34.267 に答える