2014-05-17 4 views
8

-std=c99을 사용하여 응용 프로그램 코드를 컴파일 할 때 c99 기능을 사용하는 데 익숙합니다.왜 커널 모듈을 컴파일하기 위해 c99 대신 gnu99를 사용해야합니까?

최근 몇 가지 기본 커널 모듈 예제를 따라 왔으며 ccflags-y := -std=c99을 makefile에 추가했습니다. 그러나 내가 만들려고했을 때 17K 줄의 오류가 발생했습니다. gnu99은 완벽하게 작동합니다.

커널 코드가 의존하는 gnu99와 c99의 차이점은 무엇입니까?

+1

+1. 그리고 당신은 처음으로 눈치 채는 사람이 아닙니다. 참조 : http://llvm.linuxfoundation.org/ – 0xC0000022L

+0

기본적으로 커널은 GCC 확장을 사용하며 전원이 꺼지면 컴파일되지 않습니다. –

+0

'커널 코드가 의존하는 gnu99와 c99의 차이점은 무엇입니까? ' 나는 당신이이 차이점을 스스로 찾을 수 있다고 생각합니다. GNU C는 ISO 표준 C에없는 여러 가지 언어 기능을 제공합니다 (-pedantic 옵션은 이러한 기능 중 하나가 사용되면 경고 메시지를 출력하도록 GCC에 지시합니다). 그래서'gnu99'로 커널을 만들고'ccflags-y : = -pedantic'을 추가하십시오. 그런 다음 경고를 분석합니다. gcc의 문서에서 가져온 것입니다 : https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/C-Extensions.html#C-Extensions –

답변

1

리눅스 커널은 많은 GCC 확장을 사용합니다. 즉, 커널에서 사용되는 C 언어는 표준을 따르지 않으며, GCC 확장을 포함하는 수퍼 세트입니다. 따라서 GNU99는 전달되어야하는 컴파일러 옵션입니다.

+1

사실, 리눅스 커널 자체는 gnu89가 아니라 gnu89를 사용하여 만들어졌습니다. (http://www.kernelhub.org/?p=2&msg=606456](http://www.kernelhub.org/?p=2&msg=606456))와 같은 의미상의 차이로 인해. 따라서 gnu89는 커널 모듈을 만들 때 표준으로 선호되어야합니다. 커널 모드 헤더가이 표준에 의존하기 때문입니다. –