18

私は Linux プログラミングが初めてで、簡単なテスト構成をコンパイルしようとしました。しかし、コンパイル時にエラーが発生します。inc.c も (app: 行に) 追加しても機能しません。ファイルを正しく含めるにはどうすればよいですか?

メイクファイル:

app: main.c inc.h
    cc -o app main.c

ターミナル:

make
cc -o app main.c
/tmp/ccGgdRNy.o: In function `main':
main.c:(.text+0x14): undefined reference to `test'
collect2: error: ld returned 1 exit status
make: *** [app] Error 1

main.c:

#include <stdio.h>
#include "inc.h"

int main()
{
    printf("Kijken of deze **** werkt:\n");
    test();

    getchar();
    return 0;
}

インチ

#ifndef INCLUDE_H

#define INCLUDE_H

void test();

#endif

inc.c

#include <stdio.h>

void test()
{
    printf("Blijkbaar wel!");
}
4

3 に答える 3

13

inc.oをコンパイルして取得したコンパイル ユニットに対してリンクする必要がありますinc.c

main.c一般に、 (推移的に)で使用される関数を含むすべてのオブジェクト ファイルを提供する必要があることを意味します。の暗黙のルールを使用してこれらをコンパイルできますmake。追加のルールを指定する必要はありません。

あなたは言えた:

app: main.c inc.o inc.h
    cc -o app inc.o main.c

また、再構築する必要があるかどうかを判断する際には考慮されませんmakeコンパイル方法を独自に認識します。そのためには、独自のルールを指定する必要がありますinc.oinc.cinc.hinc.o

于 2013-03-15T19:00:30.793 に答える
4

inc.c ファイルをコンパイルしなかった

app: main.c inc.h
    cc -o app main.c inc.c
于 2013-03-15T19:01:12.917 に答える
3

inc.c同様にコンパイルする必要があります。適切なアプローチ (より大きなアプリケーションへの拡張性が高い) は、Makefile を異なるターゲットに分割することです。アイデアは、すべてのオブジェクト ファイルに対して 1 つのターゲット、次に最終的なバイナリに対して 1 つのターゲットです。オブジェクトファイルをコンパイルするには、-c引数を使用します。

app: main.o inc.o
    cc -o app main.o inc.o

main.o: main.c inc.h
    cc -c main.c

inc.o: inc.c inc.h
    cc -c inc.c
于 2013-05-01T11:24:41.290 に答える