2013-03-15 10 views
14

私は簡単なテストの建設をコンパイルしようとしたのLinuxプログラミングに新しいですが含まれています。コンパイル時にエラーが発生します。 inc.cも(app:行で)追加することはできません。ファイルをどのように正しく含めるべきですか?Makefileは、ヘッダ

のMakefile:

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

inc.h

#ifndef INCLUDE_H 

#define INCLUDE_H 

void test(); 

#endif 

inc.c

#include <stdio.h> 

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

答えて

10

あなたはinc.cをコンパイルして得られるコンパイル単位inc.oに対してリンクする必要があります。あなたは(推移)main.cに使用されている機能が含まれているすべてのオブジェクトファイルを供給しなければならないことを意味し、一般的に

makeの暗黙的な規則でこれらをコンパイルすることができます。余分な規則を指定する必要はありません。

あなたは言うことができる:

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

そしてmakeinc.oを再構築しなければならないかどうかを判断する際にはは、アカウントにinc.hになりませんが、inc.cからinc.oをコンパイルする方法を自分自身で知ることができます。あなたのためには、にあなた自身のルールを指定する必要があります。

2

あなたは、同様inc.cをコンパイルする必要が

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

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.h 

inc.o: inc.c inc.h 
    cc -c inc.c inc.h 
+0

なぜヘッダファイルを 'cc -c main.c inc.h'と' cc -c inc.c inc.h'に入れますか? – navigaid