Gcc 옵션 질문입니다

컴파일 과정을 보는중에 몇가지 알수없는 것들이 있어서 질문합니다. gcc에서 보통 사용되는 옵션들은 메뉴얼에잘 설명안됬다 하더라도 언급이 되어있는데 -DQT_SHARED,-DHAVE_CONFIG_H 같은 알수 옵션들이 있더군요.

흥미로운 사실은 아래의 옵션을 빼면 라이브러리를 제대로 사용못하는지 링커가 에러를 내면서 작업을 정지합니다 -_-

처음에는 그냥 그렇게 사용하면 된다고해서 그냥 넘겼는데, 지금은 무지 궁금하네요. 알고 계신분이 있으시다면 무엇인가 답면을 해주시면 정말로 큰 힘이 될겁니다 ㅠㅠ

[code:1qfjqhze]
gcc [-c|-S|-E] [-std=standard]
[-g] [-pg] [-Olevel]
[-Wwarn...] [-pedantic]
[-Idir...] [-Ldir...]
[-Dmacro[=defn]...] [-Umacro]
[-foption...] [-mmachine-option...]
[-o outfile] [@file] infile...
[/code:1qfjqhze]
여기서 -Dmacro가 있습니다. 즉, macro를 값 없이 정의한 것입니다.

[quote="taba":14718kvz]컴파일 과정을 보는중에 몇가지 알수없는 것들이 있어서 질문합니다. gcc에서 보통 사용되는 옵션들은 메뉴얼에잘 설명안됬다 하더라도 언급이 되어있는데 -DQT_SHARED,-DHAVE_CONFIG_H 같은 알수 옵션들이 있더군요.

흥미로운 사실은 아래의 옵션을 빼면 라이브러리를 제대로 사용못하는지 링커가 에러를 내면서 작업을 정지합니다 -_-

처음에는 그냥 그렇게 사용하면 된다고해서 그냥 넘겼는데, 지금은 무지 궁금하네요. 알고 계신분이 있으시다면 무엇인가 답면을 해주시면 정말로 큰 힘이 될겁니다 ㅠㅠ[/quote:14718kvz]

일반적으로 어떤 선택에 따라 특정 내용들을 포함하거나 뺄 때 사용합니다.
대충 예를 들면

[code:14718kvz]
#ifdef MINUS
printf("MINUS\n");
#else
printf("OTHER\n");
#endif
[/code:14718kvz]
gcc -D__MINUS__ … : ==> MINUS 출력
gcc … ==> OTHER 출력

여기서의 -D__MINUS__는 위의 #ifdef 위에 #define MINUS 한것과 같은 효과입니다.
printf는 예이고 include나 define, typedef, 함수선언등등…

gcc의 -D매크로 옵션은 컴파일하기전에 전처리기에 매크로를 전달합니다.
그리고, 일반적으로 make할때에는 CCFLAGS라는 환경변수에 -D매크로 옵션을 넣어서 사용합니다.

CCFLAGS=-DMY_TEST=0 make
gcc -DMY_TEST=0 -o my_code -c my_code.c

my_code.c 소스코드 안에서…

매크로가 정의되어 있는지에 따라 처리
#ifdef MY_TEST

#else

#endif

해당 매크로값이 1이면 처리
#if MY_TEST

#else

#endif

전처리기는 컴파일하기 이전에 처리됩니다. 그래서 전처리기이죠.

[code:2obvyqq1]
if (argc>1
#if MY_TEST
&& argc>2
#endf
) {
#if MY_TEST
puts(argv[2]);
#else
puts(argv[1]);
#endf
}
[/code:2obvyqq1]

이런식으로도 코딩이 가능합니다.

매크로는 소스 코드내에 직접 삽입된 것 과 같은 효과입니다.
그래서 C언어를 배울 때 #define으로 매크로 정의할 때, 정의문은 왠만하면 소괄호로 둘러싸라고 배웁니다.

소스 코드 내에서 커널 버젼을 판단하여 처리할 경우에도 이와 같이 매크로 정의에 따라 처리하게 됩니다.

모든분들 너무 감사합니다 ㅜㅜ
이렇게까지 자세히 설명받으리라고는 생각하지 못했거든요.

이렇게 답변받으면 막막한 리눅스가 좀더 가까있는 느낌이 듬니다.