taba
1
컴파일 과정을 보는중에 몇가지 알수없는 것들이 있어서 질문합니다. 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으로 매크로 정의할 때, 정의문은 왠만하면 소괄호로 둘러싸라고 배웁니다.
소스 코드 내에서 커널 버젼을 판단하여 처리할 경우에도 이와 같이 매크로 정의에 따라 처리하게 됩니다.
taba
5
모든분들 너무 감사합니다 ㅜㅜ
이렇게까지 자세히 설명받으리라고는 생각하지 못했거든요.
이렇게 답변받으면 막막한 리눅스가 좀더 가까있는 느낌이 듬니다.