2012-12-01 21 views
8

मेरे पास मेकफ़ाइल (और शायद सामान्य रूप से) में संकलन और लिंकिंग के संबंध में एक प्रश्न है।मेकफ़ाइल, संकलन और लिंकिंग

मेरे पास एक server.c फ़ाइल है जिसमें मुख्य प्रोग्राम शामिल है जिसमें main() फ़ंक्शन है। server.c में rio.c. शामिल है मेरे पास rio नामक एक मॉड्यूल है जिसमें rio.c और rio.h शामिल हैं। इसमें main() फ़ंक्शन नहीं है।

मेरे पास दो प्रश्न हैं, वास्तव में मेकफ़ाइल कैसे लिखना है, और ऐसी चीज करने के लिए सबसे अच्छा अभ्यास है।

Q1:

CC = gcc 
CFLAGS = -Wall -Werror -Wmissing-prototypes 
OBJS = server.o rio.o 

all: $(OBJS) 
    $(CC) $(CFLAGS) $(OBJS) -o sysstatd 

server.o: server.c 
    $(CC) $(CFLAGS) -c server.c 

rio.o: rio.c rio.h 
    $(CC) $(CFLAGS) -c rio.c 

clean: 
    rm -f *~ *.o sysstatd 

मैं इस के साथ मुद्दों को जोड़ने हो रहा है: Makefile

मैं निम्नलिखित Makefile है लिखने के लिए कैसे। यह कहता है कि मेरे पास सी में उपयोग किए गए सभी कार्यों की कई परिभाषाएं हैं। मुझे यकीन नहीं है कि यह कैसे संभव है क्योंकि server.c को -c ध्वज के साथ संकलित किया गया है, इसलिए वास्तव में कुछ भी जुड़ा हुआ नहीं है। यह पता होना चाहिए कि कुछ फ़ंक्शन मौजूद हैं लेकिन वास्तव में उन्हें all नियम दोनों ऑब्जेक्ट फ़ाइलों को एक साथ संकलित नहीं करते हैं और एक ऑब्जेक्ट फ़ाइल उत्पन्न करते हैं जिसमें सब कुछ जुड़ा हुआ है।

यहां समस्या क्या है?

Q2: सर्वश्रेष्ठ अभ्यास जब से मैं एक मॉड्यूल और फिर एक और फ़ाइल जो मुख्य कार्यक्रम में शामिल है, मैं मुख्य कार्यक्रम, server.c संकलन चाहिए, एक अलग मॉड्यूल के रूप में और फिर all में एक साथ दोनों संकलन, या सर्वर संकलन सभी में .c और rio.o मॉड्यूल वहाँ जोड़ें? ध्यान दें कि यह अभी भी ऊपर की एक ही लिंकिंग समस्या उत्पन्न करता है, इसलिए मुझे पूरा यकीन है कि मेरी समस्या कहीं और है।

+0

आप किसी भी बाह्य पुस्तकालयों का उपयोग कर रहे हैं? – zeboidlund

+0

हां। लेकिन यह मेरे अपने कार्यों पर त्रुटियों को बुला रहा है कि सर्वर.c ने उन्हें पहले परिभाषित किया है। server.c और rio.h दोनों आयात: stdio.h, stdlib.h, unistd.h और errno.h – darksky

+3

जब आप कहते हैं, "server.c में rio.c शामिल है", तो क्या आपका मतलब है कि फ़ाइल 'सर्वर में।सी', आपके पास '#include "rio.c" जैसी रेखा है? यदि ऐसा है, तो यह गलत तरीका है और त्रुटि का संभावित स्रोत है; आपको इसके बजाय 'rio.h' शामिल होना चाहिए। –

उत्तर

13

आप संरचना एक छोटे से संशोधित करना चाहिए:

CC = gcc 
CFLAGS = -Wall -Werror -Wmissing-prototypes 
OBJS = server.o rio.o 

all: sysstatd 

sysstatd: $(OBJS) 
    $(CC) $(CFLAGS) $(OBJS) -o sysstatd 

server.o: server.c 
    $(CC) $(CFLAGS) -c server.c 

rio.o: rio.c rio.h 
    $(CC) $(CFLAGS) -c rio.c 

clean: 
    rm -f *~ *.o sysstatd 

अंतर यह है कि जाली नियम allsysstatd तारीख तक किया जा रहा है पर निर्भर करता है, और sysstatd अप टू डेट है जब यह तारीख wrt वस्तु पर निर्भर है है फ़ाइलें।

अब यह स्पष्ट रूप से संकलन कार्यों को लिखकर, वर्बोज़ है। यह उपयोग करने के लिए पर्याप्त होगा:

CC = gcc 
CFLAGS = -Wall -Werror -Wmissing-prototypes 
OBJS = server.o rio.o 

all: sysstatd 

sysstatd: $(OBJS) 
    $(CC) $(CFLAGS) $(OBJS) -o sysstatd 

server.o: server.c 
rio.o: rio.c rio.h 

clean: 
    rm -f *~ *.o sysstatd 

तुम भी बहस कर सकते हैं: server.crio.h उपयोग नहीं करता है? यदि ऐसा होता है, निर्भरता सूचीबद्ध होना चाहिए। यदि नहीं, rio.h क्यों मौजूद है? make मान लेंगे कि server.oserver.c पर निर्भर करता है, इसलिए आपको इसे निर्दिष्ट करने की आवश्यकता नहीं है (लेकिन यह हेडर के बारे में धारणा नहीं करेगा)। तुम भी प्रोग्राम नाम की पुनरावृत्ति को रोकने के लिए कोई मैक्रो इस्तेमाल कर सकते हैं:

CC = gcc 
CFLAGS = -Wall -Werror -Wmissing-prototypes 
OBJS = server.o rio.o 
PROG = sysstatd 

all: $(PROG) 

$(PROG): $(OBJS) 
    $(CC) $(CFLAGS) $(OBJS) -o [email protected] 

server.o: rio.h 
rio.o: rio.h 

clean: 
    rm -f *~ *.o $(PROG) core a.out 

यदि आप अन्य पुस्तकालयों की जरूरत है, तो आप उपयोग कर सकते हैं:

CC = gcc 
CFLAGS = -Wall -Werror -Wmissing-prototypes 
OBJS = server.o rio.o 
PROG = sysstatd 
LOCALLIBDIR = /usr/local/lib 
LDFLAGS = -L$(LOCALLIBDIR) 
LDLIBS = -lone -ltwo 

all: $(PROG) 

$(PROG): $(OBJS) 
    $(CC) $(CFLAGS) $(OBJS) -o [email protected] $(LDFLAGS) $(LDLIBS) 

server.o: rio.h 
rio.o: rio.h 

clean: 
    rm -f *~ *.o $(PROG) core a.out 
+1

इस तरह से कदम से कदम में सुधार हुआ यह बेहद फायदेमंद है। धन्यवाद। –

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