2013-03-15 26 views
14

Ben basit bir test inşaat derlemeye çalıştık Linux programlama için yeni sayılabilir. Ama derlerken bir hata alıyorum. Inc.c'nin de eklenmesi (app: line) çalışmıyor. Dosyayı nasıl doğru eklemeliyim?Makefile başlığını

Makefile:

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

Terminali:

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!"); 
} 

cevap

10

Sen inc.c derleyerek elde derleme birimine inc.o karşı bağlamak gerekir. Genelde

Eğer main.c (geçişli) kullanılan işlevleri içeren tüm nesne dosyalarını temin gerektiği anlamına geldiğini. Sen make örtük kuralları ile bunlar, gerek ekstra kuralları belirtmek için derlemek olabilir.

Sen söyleyebiliriz:

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

Ve makeinc.o yeniden oluşturulması gerekir olmadığını belirlerken o dikkate inc.h almaz rağmen inc.c den inc.o derlemeye nasıl kendi başına bilecektir. Bunun için kendi kurallarını belirtmek gerekir .

2

Eğer Siz de inc.c derlemek için gereken inc.c dosyasını

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

derlemek vermedi. Uygun bir yaklaşım (büyük uygulamalar için daha iyi bir şekilde büyütülebilir) farklı hedefler içine Makefile'a bölünmüş olacaktır. Fikir şu: her nesne dosyası için bir hedef, daha sonra nihai ikili için bir hedef. nesne dosyalarını derlemek için, -c argüman kullanırlar.

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" ve "cc -c inc.c inc.h" başlık dosyalarını neden koyarsınız? – navigaid