2013-02-17 17 views
8

मैंने pila.h और pila.c फ़ाइलों के साथ एक लाइब्रेरी बनाई है। मैं फ़ाइल pila.cgcc pila.c -c के साथ संकलित करता हूं और यह पुस्तकालय ठीक काम करता है। मैंने इसका परीक्षण किया है।जीसीसी का उपयोग कर सी पर पुस्तकालय संकलित कैसे करें?

फिर मैंने एक और लाइब्रेरी बनाई। इस पुस्तकालय में pila_funciones_extra.h और pila_funciones_extra.c फ़ाइलें हैं। इस पुस्तकालय में मुझे पहली लाइब्रेरी शामिल करने की आवश्यकता है। फ़ाइल pila_funciones_extra.h में मैं इसे शामिल करने के लिए अगली पंक्ति में कहें:

#include "pila.h" 

और फ़ाइल pila_funciones_extra.c में मैं अगली पंक्ति डाल:

#include "pila_funciones_extra.h" 

के रूप में यह हो गया है।

लेकिन जब मैं फ़ाइल pila_funciones_extra.c फ़ाइल संकलित करने का प्रयास करता हूं तो संकलक लाइब्रेरी pila को शामिल करने की पहचान नहीं करता है। यह कहता है कि पुस्तकालय pila में परिभाषित कार्यों, संरचनाओं, स्थिरांक और मैक्रोज़ को परिभाषित नहीं किया गया है।

मैंने इसे gcc pila_funciones_extra.c -c और gcc pila_funciones_extra.c -c pila.o से संकलित करने का प्रयास किया लेकिन यह काम नहीं करता है।

मैंने सुनिश्चित किया कि सभी फाइलें एक ही फ़ोल्डर में हैं।

मैं उबंटू पर काम कर रहा हूं।

क्या कोई मुझे संकलित करने का सही तरीका बता सकता है?

+2

कृपया आपको प्राप्त होने वाली _exact_ कंपाइलर त्रुटि पोस्ट करें (संकलन लाइन + आउटपुट की पहली 5-10 पंक्तियां)। – Mat

+0

क्या आप 'pila_funciones_extra.c' संकलित करते समय ध्वज' -l pila.o' का उपयोग करते हैं? –

+0

क्या आप किसी भी समावेश-गार्ड का उपयोग कर रहे हैं? '# Ifndef's'? उदाहरण के लिए यदि आप दोनों शीर्षकों में इसका उपयोग करते हैं तो केवल '_extra.h' को शामिल किया जाएगा। –

उत्तर

1

आप पहली बार अलग से तो संकलन कर सकते हैं कई फाइलों से बना एक पुस्तकालय के लिए और फिर इस कार्य करें:

ar ruv mylib.a pila_funciones_extra.o pila.o 
ranlib mylib.a 

यह आदेश का कारण बनता है पुस्तकालय बनाया जाना है, तो यह पहले से ही मौजूद नहीं है। यदि ऐसा होता है, तो .o फ़ाइलें अपडेट की जाती हैं (या इस लाइब्रेरी में जोड़ दी जाती हैं)। ranlib लाइब्रेरी को यादृच्छिक बनाने के लिए प्रयोग किया जाता है जो लोडर के लिए उपयोगी है।

आप इस लाइब्रेरी का उपयोग करते हैं, है न:

gcc -o myapp myapp.c mylib.a 
18

सबसे पहले, हमेशा आदत -Wall साथ संकलित करने के लिए विकल्प gcc करने के लिए ले (और शायद यह भी भी-Wextra भी अधिक चेतावनी प्राप्त करने के लिए); यह आपको लगभग सभी चेतावनियां देता है, और आपको तब तक अपना कोड सुधारना चाहिए जब तक कोई चेतावनी नहीं दी जाती।

फिर आप अक्सर अपने कोड को डीबग करने में सक्षम होना चाहते हैं, इसलिए -g से gcc पर भी पास करें। एक बार जब आप अपने कोड से आश्वस्त हो जाते हैं तो आप -O2 के साथ अनुकूलित मशीन कोड का उत्पादन करने के लिए gcc से पूछ सकते हैं। gdb डीबगर का उपयोग करना सीखें।

तो अपनी पहली लाइब्रेरी संकलित करें, इसकी स्रोत फाइलें first1.c और first2.cFirstLib/ निर्देशिका में हैं, उदाहरण के साथ

cd FirstLib/ 
gcc -Wall -g -c first1.c -o first1.o 
gcc -Wall -g -c first2.c -o first2.o 

इस बिंदु पर, आप एक Makefile का उपयोग करें और make का उपयोग कैसे करें, विशेष रूप से, क्योंकि आप प्राप्त करना चाहते हैं अपने libfirst.a

ar ruv libfirst.a first1.o first2.o 
ranlib libfirst.a 

फिर से आप के लिए विकल्प के रूप में पिछले -L../FirstLib -lfirst पारित कर सकते हैं सीखना चाहिए gcc आपके libfirst.a

का उपयोग करके अपने प्रोग्राम को संकलित और लिंक करने का आदेश दें, फिर अपने Makefile में अपनी दूसरी लाइब्रेरी संकलित करें निर्देशिका SecondLib/ जो बहुत शायद शामिल करना चाहिए

# in SecondLib/Makefile 
CC=gcc 
CFLAGS= -I../FirstLib/ -Wall -g 
## add your other stuff for make 

आदि आदि आप वास्तव में make का उपयोग करें और अपने खुद के समय Makefile तो ले -s GNU make documentation पढ़ने के लिए लिखने के लिए कैसे सीखना चाहते हैं।

आप इसे आपके पास सभी शामिल फ़ाइलें बता के लिए gcc को -H पारित करने के लिए चाहते हो सकता है, और आप भी चलाकर विशेष रूप से remake उपयोग करने के लिए (इसके अलावा make की & प्रतिस्थापन में) अपने और अधिक जटिल Makefile -s डिबग करने के लिए (चाहते हो सकता है remake -x)। HereMakefile का एक उदाहरण है; आप कई अन्य पाएंगे!

Program Library Howto भी पढ़ें।

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