2010-05-29 23 views
14

Ben bir Makefile kullanarak bir Linux çekirdek modülü derlemek çalışıyorum:C99 nasıl kullanılır ve derlenir?

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 

bana verir:

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

Ben C99 geçmek gerekir. Okuduktan sonra, ekleneceğini düşündüğünüzden emin olmak için bir bayrak -std = c99 eklemem gerektiğini fark ettim.

Makefile'ı nasıl değiştiririm böylece C99 olarak derlenir?

+0

C99'un PHP hehe için bir istismar betiği olduğunu düşünmüştüm – RobertPitt

cevap

-6

Makefile ile ilgisi yok.

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; 
} 

Yalnızca "düzeltme" olabilir ... bu şekilde modifiye edilmesi gerekir Dolayısıyla bu

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; 
} 

gibi - ISO C90 yerde ama bir blok veya dosyanın başında değişkenleri bildirme yasaklamaktadır kaynak kodunda, makefile değil.

Bu kural C99 rahat olmuştur, ama bence o

yüzden C99 ile derlemek yapmak için makefile değiştirmek için ona :) altındaki kodundan değişken tanımlar, bildirimleri ve başlatmalarını ayırmak için iyi bir fikirdir Makefile'yi makefile uyguladığınız "derleme" dizininde değiştirmeniz ve kaynak dosyayı derleyen "gcc" satırında "-std = c99" değerini eklemeniz gerekir.

+7

CFLAGS, derleyicinin her bir çağrısını düzenlemek yerine çok daha yaygın, tercih edilen ve daha az kırılgandır. –

+4

OO (Java) dünyasında uzun bir süre yaşadıktan ve son günlerde C'yi tekrar kullanmaya başladıktan sonra, değişken bilgiyi ayırma noktasında aynı fikirde değilim. Her şeyi olabildiğince küçük tutmak, daha önemli görünmektedir. Bazı değişkenlere sadece bir süre veya döngü için ihtiyaç duyulur. – powerj1984

+0

@ powerj1984 Bu durumda brace {} kapsamını kullanabilirsiniz. LukeN, kernel ana hattı * tarafından neyin kabul edileceği gibi doğrudur. Bunun iyi bir şey olup olmadığı, söylemeyeceğim ve OP'nin sorduğu gibi değil. –

14

Sadece senin makefile üstüne

CFLAGS=-std=c99 

ekleyebilir veya C90 ile uyumlu kod yapabilirsiniz (Luken anlaşılacağı gibi.)

17

derleyici bayrakları eklemek için doğru yolu derlerken modüller ccflags-y değişkenini ayarlayarak. Şunun gibi:

ccflags-y := -std=gnu99 

fazla bilgi için çekirdek ağacında Documentation/kbuild/makefiles.txt bakın.

Linux çekirdeği GNU uzantılarına yoğun bir şekilde bağlı olduğu için c99 yerine gnu99 standardını kullandığımı unutmayın.

+3

Merhaba, kendi modülüm için Makefile'e ccflags-y ekledim, ancak derleyici hala "ISO C90'ın karışık bildirimleri ve kodu yasakladığını" uyarıyor. Niye ya? – basicthinker

+3

@basicthinker: belki [bu] (http://stackoverflow.com/questions/15910064/how-to-compile-a-linux-kernel-module-using-std-gnu99) yardımcı olur –