2010-05-29 6 views
14

मैं एक Makefile का उपयोग कर एक लिनक्स कर्नेल मॉड्यूल संकलित करने के लिए कोशिश कर रहा हूँ:सी 99 के रूप में बनाने और संकलित करने के लिए कैसे उपयोग करें?

obj-m += main.o 

all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

कौन सा मुझे देता है:

main.c:54: warning: ISO C90 forbids mixed declarations and code 

मैं C99 के लिए स्विच की जरूरत है। पढ़ने के बाद मैंने देखा कि मुझे फ्लैग -स्ट = सी 99 जोड़ने की ज़रूरत है, यह सुनिश्चित नहीं है कि यह कहां जोड़ा जाना है।

मैं मेकफ़ाइल कैसे बदलूं ताकि यह सी 99 के रूप में संकलित हो सके?

+0

मैंने सोचा कि सी 99 PHP के लिए एक शोषण स्क्रिप्ट थी, – RobertPitt

उत्तर

-6

इसे मेकफ़ाइल के साथ कुछ लेना देना नहीं है। आईएसओ C90 कहीं भी लेकिन एक ब्लॉक या फ़ाइल की शुरुआत में चर घोषित करने की मनाही है - इस

int main(int argc, char **argv) { 
    int a; /* Ok */ 
    int b = 3; /* Ok */ 

    printf("Hello, the magic number is %d!\n", b); 
    int c = 42; /* ERROR! Can only declare variables in the beginning of the block */ 
    printf("I also like %d.. but not as much as %d!\n", c, b); 

    return 0; 
} 

इस प्रकार यह इस करने के लिए संशोधित किया जाना है की तरह ...

int main(int argc, char **argv) { 
    int a; /* Ok */ 
    int b = 3; /* Ok */ 
    int c = 42; /* Ok! */ 

    printf("Hello, the magic number is %d!\n", b); 
    printf("I also like %d.. but not as much as %d!\n", c, b); 

    return 0; 
} 

आप केवल "ठीक" कर सकते हैं कि स्रोत कोड में, मेकफ़ाइल में नहीं।

यह नियम C99 में ढील दी गई है, लेकिन मेरी राय में यह एक अच्छा विचार है यह :) नीचे कोड से चर परिभाषाएँ, घोषणाओं और initializations को अलग करने के

तो अपने makefile बदलने के लिए यह C99 के साथ संकलन करने के लिए , आपको मेकफ़ाइल को "बिल्ड" निर्देशिका में बदलने की आवश्यकता है जो आपकी मेकफ़ाइल संदर्भित कर रहा है, और स्रोत फ़ाइल को संकलित करने वाली "gcc" पंक्ति में "-std = c99" जोड़ें।

+7

CFLAGS संकलक के प्रत्येक आमंत्रण को संपादित करने से कहीं अधिक आम, पसंदीदा और कम नाजुक है। –

+4

ओओ (जावा) दुनिया में लंबे समय तक रहने के बाद और हाल ही में दिन के आधार पर सी का उपयोग करने में वापस आने के बाद मुझे परिवर्तनीय जानकारी को अलग करने के बारे में इस मुद्दे से असहमत होना पड़ता है। चीजों को जितना संभव हो उतना छोटा सा रखना उतना ही महत्वपूर्ण लगता है। कुछ चर केवल थोड़ी देर के अंदर या उदाहरण के लिए लूप के लिए आवश्यक होंगे। – powerj1984

+0

@ powerj1984 आप इस मामले में ब्रेस {} स्कोपिंग का उपयोग कर सकते हैं। ल्यूकएन * के रूप में सही है * कर्नेल मुख्य पंक्ति * द्वारा क्या स्वीकार किया जाएगा। चाहे वह चारों ओर एक अच्छी बात है, मैं नहीं कहूंगा और मुझे लगता है कि ओपी ने पूछा नहीं है। –

14

तुम बस

CFLAGS=-std=c99 

अपने makefile का संकलक झंडे को जोड़ने के लिए सही तरीका है जब संकलन जोड़ सकते हैं शीर्ष करने के लिए, या आप C90 के साथ कोड के अनुरूप कर सकते हैं (जैसा कि Luken पता चलता है।)

17

मॉड्यूल ccflags-y चर सेट करके है। इस तरह:

ccflags-y := -std=gnu99 

अधिक जानकारी के लिए कर्नेल पेड़ में Documentation/kbuild/makefiles.txt देखें।

ध्यान दें कि मैं c99 के बजाय gnu99 मानक का उपयोग कर रहा हूं क्योंकि लिनक्स कर्नेल जीएनयू एक्सटेंशन पर भारी निर्भर करता है।

+3

हाय, मैं अपने स्वयं के मॉड्यूल के लिए मेकफ़ाइल में ccflags-y जोड़ता हूं, लेकिन संकलक अभी भी चेतावनी देता है कि "आईएसओ सी 9 0 मिश्रित घोषणाओं और कोड को रोकता है"। क्यूं कर? – basicthinker

+3

@basicthinker: शायद [यह] (http://stackoverflow.com/questions/15910064/how-to-compile-a-linux- कर्नेल- मॉड्यूल-using-std-gnu99) मदद करता है –

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