2012-04-27 26 views
16

ठीक है, मैं इसे सबसे लंबे समय तक काम करने की कोशिश कर रहा हूं, और मुझे बस इसे सही काम करने के लिए प्रतीत नहीं होता है। मेरे पास तीन फाइलें हैं, main.c, hello_world.c, और hello_world.h। किसी भी कारण से वे अच्छी तरह से संकलित नहीं लग रहे हैं, और मैं वास्तव में यह नहीं समझ सकता कि क्यों ...सी हेडर समस्या: # शामिल करें और "अपरिभाषित संदर्भ"

यहां मेरी स्रोत फ़ाइलें हैं। सबसे पहले hello_world.c:

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

int hello_world(void) { 
    printf("Hello, Stack Overflow!\n"); 
    return 0; 
} 

फिर hello_world.h, सरल:

int hello_world(void); 

और फिर अंत में main.c:

#include "hello_world.h" 

int main() { 
    hello_world(); 
    return 0; 
} 

जब मैंने इसे जीसीसी में डाल दिया, यह क्या है मुझे मिलता है:

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

कोई भी मेरी मदद करने में सक्षम है? मैं वास्तव में इस पर अटक गया हूं, लेकिन मुझे 99 प्रतिशत यकीन है कि यह वास्तव में एक साधारण फिक्स है।

उत्तर

35
gcc main.c hello_world.c -o main 

कोशिश, हमेशा शीर्ष लेख गार्ड का उपयोग करें:

#ifndef HELLO_WORLD_H 
#define HELLO_WORLD_H 

/* header file contents go here */ 

#endif /* HELLO_WORLD_H */ 
+1

धन्यवाद! उन छोटी सी चीज़ों में से एक जो प्रोग्रामर की यात्रा करते हैं। :) – user1018501

+1

हालांकि हेडर गार्ड अनावश्यक हैं (इस उदाहरण में) यह एक अच्छा संकेत है – KevinDTimm

+1

@ user1018501: यदि इस उत्तर ने आपकी समस्या हल की है, तो आपको इसे स्वीकार करना चाहिए। – Job

3

आप अपने main.o के साथ अपने दूसरे ग फ़ाइल hello_world.c से compled वस्तु फ़ाइल लिंक करना चाहिए

इसके अलावा इस

cc -c main.c 
cc -c hello_world.c 
cc *.o -o hello_world 
8

आप संकलन में hello_world.c शामिल नहीं हैं।

gcc hello_world.c main.c -o main 
4

आप hello_world.c से लिंक नहीं कर रहे हैं।

cc -o main main.c hello_world.c

अधिक जटिल परियोजनाओं अक्सर, स्क्रिप्ट बनाने या फ़ाइलों को अलग संकलन और जोड़ने आदेशों बनाने का उपयोग लेकिन उपरोक्त आदेश (संयोजन:

यह करने के लिए एक आसान तरीका यह संकलन आदेश को चलाने के लिए है दोनों चरणों) छोटी परियोजनाओं के लिए ठीक करना चाहिए।

+0

हां, आपको निश्चित रूप से 'मेक' (या बेहतर इमारत प्रणाली, जैसे 'ओमेक') के बारे में जानना चाहिए –

1

हां ऐसा लगता है कि आप hello_world.c को लिंक करना भूल गए हैं। मैं gcc hello_world.c main.c -o मुख्य होगा। यदि फाइलों की संख्या कम है तो हम इस दृष्टिकोण का उपयोग कर सकते हैं लेकिन बड़ी परियोजनाओं में फ़ाइलों को बनाने या कुछ संकलन स्क्रिप्ट बनाने के लिए बेहतर है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^