मेरे पास मेकफ़ाइल (और शायद सामान्य रूप से) में संकलन और लिंकिंग के संबंध में एक प्रश्न है।मेकफ़ाइल, संकलन और लिंकिंग
मेरे पास एक 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 मॉड्यूल वहाँ जोड़ें? ध्यान दें कि यह अभी भी ऊपर की एक ही लिंकिंग समस्या उत्पन्न करता है, इसलिए मुझे पूरा यकीन है कि मेरी समस्या कहीं और है।
आप किसी भी बाह्य पुस्तकालयों का उपयोग कर रहे हैं? – zeboidlund
हां। लेकिन यह मेरे अपने कार्यों पर त्रुटियों को बुला रहा है कि सर्वर.c ने उन्हें पहले परिभाषित किया है। server.c और rio.h दोनों आयात: stdio.h, stdlib.h, unistd.h और errno.h – darksky
जब आप कहते हैं, "server.c में rio.c शामिल है", तो क्या आपका मतलब है कि फ़ाइल 'सर्वर में।सी', आपके पास '#include "rio.c" जैसी रेखा है? यदि ऐसा है, तो यह गलत तरीका है और त्रुटि का संभावित स्रोत है; आपको इसके बजाय 'rio.h' शामिल होना चाहिए। –