2013-03-15 5 views
14

मैं लिनक्स प्रोग्रामिंग में नया हूं, मैंने एक साधारण परीक्षण निर्माण को संकलित करने का प्रयास किया। लेकिन संकलन करते समय मुझे एक त्रुटि मिल रही है। Inc.c को भी जोड़ना (ऐप में: लाइन) काम नहीं करता है। मुझे फ़ाइल को सही कैसे शामिल करना चाहिए?मेकफ़ाइल में हेडर

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.o जो आप inc.c संकलन के द्वारा प्राप्त के खिलाफ लिंक होना चाहिए।

सामान्यतः इसका मतलब है कि आपको उन सभी ऑब्जेक्ट फ़ाइलों को आपूर्ति करना होगा जिनमें main.c (पारगमन) में उपयोग किए जाने वाले फ़ंक्शंस शामिल हैं। आप इन्हें make के निहित नियमों के साथ संकलित कर सकते हैं, अतिरिक्त नियम निर्दिष्ट करने की आवश्यकता नहीं है।

आप कह सकते हैं:

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

और make कैसे inc.c से inc.o संकलित करने के लिए हालांकि यह नहीं खाते में inc.h ले जाएगा जब पता लगा सके कि inc.o फिर से बनाया जाना चाहिए अपने आप ही पता चल जाएगा। इसके लिए आप अपने नियमों को निर्दिष्ट करना होगा।

2

आप inc.c फ़ाइल

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

संकलन नहीं किया साथ ही आप inc.c संकलित करने के लिए की जरूरत है। मेकफ़ाइल को विभिन्न लक्ष्यों में विभाजित करने के लिए एक उपयुक्त दृष्टिकोण (बड़े अनुप्रयोगों के लिए बेहतर स्केलेबल) होगा। विचार यह है: प्रत्येक ऑब्जेक्ट फ़ाइल के लिए एक लक्ष्य, फिर अंतिम बाइनरी के लिए एक लक्ष्य। ऑब्जेक्ट फ़ाइलों को संकलित करने के लिए, -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