2013-03-15 29 views
14

我是Linux編程的新手我試圖編譯一個簡單的測試構造。但編譯時出現錯誤。添加inc.c(在app:行中)也不起作用。我應該如何包含正確的文件?Makefile include header

的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 

而且make會知道自身如何從inc.c編譯inc.o雖然確定是否inc.o必須重建時,它會採取inc.h考慮。爲此,你必須指定你自己的規則。

2

你沒有編譯inc.c文件

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

您需要編譯inc.c爲好。一個合適的方法(更好地擴展到更大的應用程序)可以將Makefile分成不同的目標。這個想法是:每個目標文件一個目標,然後是最終二進制文件的一個目標。要編譯目標文件,請使用-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 2017-03-21 12:58:52