solaris에서 shm_open compile 에러..
글쓴이: psjcap / 작성시간: 월, 2005/01/24 - 11:47오전
solaris에서 CC 컴파일러를 사용하고 있는데요..
shm_open 함수 사용시..
함수를 찾을 수 없다는 에러가 계속 나오더군요..
그래서 -D_POSIX_C_SOURCE=4 를 Makefile에 추가했더니..
shm_open 함수 부분은 컴파일이 되는데..
gettimeofday에서 사용하기 위한 timeval 구조체에서 아래처럼 모두 에러가 나네요..ㅡㅡ;
The type "timeval" is incomplete.
혹시 동일한 경험 있으신 분..
이거 어떻게 해야 하나여.?
Forums:
링커 옵션을 제대로줬나요?shm_open 경우 man 해보면 나오
링커 옵션을 제대로줬나요?
shm_open 경우 man 해보면 나오지만 -lrt 해야 합니다.
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
-lrt는 물론 달았구요..링크 에러가 아니라.. 컴파일 에러입니다.
-lrt는 물론 달았구요..
링크 에러가 아니라.. 컴파일 에러입니다..
그래서 header 파일을 뒤져 보았더니..
다음과 같이 되어 있네요..ㅡㅡ;
즉 _POSIX_C_SOURCE가 define 되어있으면..
timeval을 못 쓴다는건데..ㅡㅡ;
timeval을 위에다 살짝 정의해 놓아봤지만..
위와 같은 이유로 다른 부분에서 에러가 또 나네요..
% man 5 standards 를 수행해 보시면 각 스펙별 feat
% man 5 standards
를 수행해 보시면 각 스펙별 feature test macro 를 보실 수 있을 것입니다.
struct timeval 은 sys/time.h 에 정의되어 있으며 XPG4v2 에서 소개되었습니다.
http://www.opengroup.org/onlinepubs/009695399/basedefs/sys/time.h.html
_POSIX_C_SOURCE=4
라는 것은 따로 정의되어 있지 않고
_POSIX_C_SOURCE=2 와 _POSIX_C_SOURCE=199309L
사이에 걸리지 않을까 생각이 됩니다. 이 경우에는
POSIX.1b-1993
에 해당되겠네요.
이 버젼의 POSIX 에서는 timeval 이 지원이 되지 않습니다.
(아마 제 생각에는 Posix.1 2001인 _POSIX_C_SOURCE=200112L 에서야
되지 않을까 생각이 됩니다.)
앞서 말씀드린 대로 해당 시점에서는 Posix와 XPG가 서로 다른 스펙으로
존재했기 때문에 XPG4v2 이상을 쓴다는 것을 나타내기 위한 지시를 해 주셔야 하는데,
앞의 인용에 보시듯이
-D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED=1
을 지정하시거나
-D_XOPEN_SOURCE=500
을 지정하시면 될 것입니다.
또는 -D_EXTENSIONS 를 사용하셔도 되고요.
이후 Single Unix Spec v.3 에서는 Posix와 통합되었으므로
-D_POSIX_C_SOURCE=200112L
을 지정하시면 문제없이 컴파일이 될 것으로 생각됩니다.
답변 주셔서 감사합니다..
답변 주셔서 감사합니다..^^
저런 내용이 있는 줄은 몰랐군요..
하지만.. 역시 컴파일은 않 되고 있습니다..ㅡㅡ;
헤더 파일에 메크로를 자세히 들여다 보니..
이 부분에서..
_POSIX_C_SOURCE 와 _XOPEN_SOURCE 는 define이 되면 않 되고..
__EXTENSIONS__ 나 _XPG4_2 중에 하나가 define 되어 있어야지 되겠네요..
기존 소스에 select나 gettimeofday를 많이 사용하였기 때문에..
timeval은 꼭 필요해서..
shm_open을 shmget으로 변경하였습니다..ㅜㅜ;
하지만 많은 도움이 되었습니다..
감사합니다..^^"
Re: 답변 주셔서 감사합니다..
조건부 컴파일문을 해석하면
1. _POSIX_C_SOURCE 와 _XOPEN_SOURCE 가 모두 정의안되어 있거나
2. __EXTENSIONS__ 가 정의되어 있거나
3. _XPG4_2가 정의되어 있는 경우
이기 때문에 2번이나 3번을 만족한다면
_POSIX_C_SOURCE와 _XOPEN_SOURCE 를 정의해도 전혀 문제가 안됩니다.
__EXTENSIONS__ 나 _XPG4_2 는 직접 정의하셔도 되겠지만,
다른 정의에 의해서 유도되기도 합니다.
Solaris 7의 /usr/include/sys/feature_tests.h 를 보시면
와 같이 되어있어서 _XOPEN_SOURCE 가 500 이거나
_XOPEN_SOURCE_EXTENDED=1인 경우에는 _XPG4_2 가
정의되도록 되어있습니다.
Solaris 7과 8에서 아래 코드와 컴파일 옵션은 아무런 오류없이 컴파일되었습니다.
댓글 달기