POLLRDNORM, OPEN_MAX 매크로 사용시 컴파일문제
Unix Network Programming 이란 책에서 예제를 하나 컴파일 하려고 했는데 에러가 나서 말이죠. 고쳐서 돌리긴 했는데, 왜 이런 에러가 나는지 궁금하네요. 생략한 소스는 두개가 같기 때문에 선언부만 올렸습니다. 실제로 선언부에서 생긴 문제더라구요.
원래소스
#include "unp.h"
#include <limits.h>
..... 중략
이걸 컴파일하면 POLLRDNORM, OPEN_MAX 매크로 가 정의 안 되었다고 뜨고 컴파일 에러가 납니다.
제가 고친 소스
#include <linux/limits.h>
#include "unp.h"
#define __USE_XOPEN
#include <bits/poll.h>
..... 중략
요렇게 하면 되긴 되던데 몇가지 의문점이 있네요.
밑에거는 실행용 소스인데요
#include <stdio.h>
#include <poll.h>
int main(int argc,char**argv)
{
int j=POLLRDNORM;
int k=POLLIN;
printf("%ld",j);
}
이걸
gcc -D_XOPEN_SOURCE 파일 이런 식으로 _XOPEN_SOURCE 매크로를 선언해서 사용해야 컴파일이 되던데요. 제가 고친 소스에서 그렇게 하면 unp.h 파일에서 u_char *inet_srcrt_init(void); 이 부분에서 컴파일 오류가 나서
#define __USE_XOPEN
#include <bits/poll.h>
요부분을 추가 했거든요. POLLRDNORM이 bits/poll.h 에서 선언되어 있고 __USE_XOPEN 이 정의되어 있어야 쓸수 있더군요. 원래는 unp.h헤더에 <poll.h> 인클루드 되어 있는데. __USE_XOPEN 이 정의가 안되어 있어서 <bits/poll.h> 에서 POLLRDNORM이 선언이 안되더 군요. __USE_XOPEN 컴파일 할때 _XOPEN_SOURCE 매크로를 정의 해서 사용하면 되지만 unp.h헤더 에서 컴파일 오류가 나서 꽁수를 쓴겁니다.
1.우선은 _XOPEN_SOURCE 매크로가 뭔지 궁금하고요
2.두번째는 OPEN_MAX 매크로 인데 이게 /usr/include/bits/local_lim.h 에서 언디파인 되더라구요 아마 이것도 unp.h헤더에 포함되어 있는것 같구요. 그래서 #include <linux/limits.h> 를 맨 윗줄에 넣었습니다. 요게 먼저 인클루드 되어 있으면 언디파인을 안하는것 같습니다.
글솜씨가 없어서 내용만 길어지고 요지도 말하지 못한것 같습니다.
1._XOPEN_SOURCE 매크로가 어떤 용도의 매크로 인지 2./usr/include/bits/local_lim.h 에서 OPEN_MAX 를 언디파인 하는 이유
이 두가지가 궁금하군요
참고로 위의 소스는 Unix networking programming volume 1 (W. Stevens) 에서 6.11 장 Figure 6.25 부분의 예제입니다. 이 책 많이 보시는 것 같더라구요. 그래서 저두 하나 샀는데 혹시 이책 보시다가 저랑 비슷한 에러 나오시는 분은 좀 가르쳐 주세요. 리눅스는 레드헷 9 를 쓰고 있습니다.
소스 필요하시면 말씀해주세요 이책에서 자체 제작한 헤더랑, 라이브러리를
소스 필요하시면 말씀해주세요 이책에서 자체 제작한 헤더랑, 라이브러리를 쓰기 때문에 컴파일 하실려면 이것이 있어야 될겁니다. 그리고 제가 받은 라이브러리에서도 Figure 6.25 부분은 없기 때문에 이것도 따로 있어야 됩니다. 혹, 필요하시면 제가 올려드릴께요.
댓글 달기