티스토리 뷰

Study/Linux

[APUE] APUE header example compile

생각많은 소심남 2013. 12. 8. 16:36

반년전에 APUE 책을 샀었는데 진짜 말그대로 사놓고 전시만 해놨다. 



그래도 시스템을 다루는데 할줄은 알아야 될거 같아서 여유가 될때마다 예제를 조금씩 해보려고 한다. 

이 책의 진행방식도 일반적인 프로그래밍 책처럼 실습위주의 예제를 따라하면서 배우는 것이다. 사실 이책의 저자인 Stevens씨가 책의 예제에만 맞게 header file을 따로 만들었다. 물론 시스템 콜을 주로 부르기 때문에 이 header file만 잘 연결되어 있으면 책내에 있는 예제를 쉽게 따라할 수 있는데 사실 이게 조금 복잡하다. 그래서 짧은 포스트를 통해서 설치 방법을 소개하고자 한다.

먼저 이 책 공식 사이트인 APUEbook.org 에서 예제관련 소스파일을 받는다.



이걸 다운받으면 tar 파일이 나오는데 이 tarball 파일을 풀면 apue.2e라는 폴더와 함께 예제 소스들이 나온다. 여기서 쓰고 있는 시스템에 맞게 몇가지를 고쳐야 한다. 제일 처음 고쳐야 할 내용이 Make.defines.linux다. (물론 지금 쓰고 있는 시스템에 맞게 파일을 찾는다. 만약 solaris 를 쓰는거면 Make.defines.solaris 파일을 수정해야 한다.) 이 파일을 열어보면 5번째 줄에 WKDIR이라는게 있을건데 이게 현재 apue.2e폴더의 위치를 적는 항목이다. 지금 이상하게 sar라는 이름으로 지정되어 있는데 이상태에서 make를 하면 당연히 오류가 발생한다. 그래서 pwd를 쓰든 현재 폴더의 위치를 찾아 지정해준다. 참고로 내 case는 다음과 같다.



이렇게 하고 터미널에서 make를 해주면 된다.

그런데 make를 하면 몇가지 error가 발생한다. 아마 첫번째로 마주치는게 이 error가 아닐까 싶다.

gcc-DLINUX-ANSI -I/home/alex/apue/apue.2e/include-Wall-D_GNU_SOURCE-DDEBUG-c-O printd.o printd.c
 In File included from / usr / include / bits / time.h: 86:0,
                  from / usr / include / time.h: 42,
                  from / usr / include / pthread.h: 26,
                  from printd.c: 11

 / usr / include / bits / timex.h: 31:7: Error: expected ':', ',', ';', '}' or '__attribute__' before token '.'

error 내용이 printd.o를 빌드하는데 timex.h 에 정의되어 있는 부분과 충돌해서 발생한다는 것이다. 참고로 이건 예제 파일의 오류다. 고쳐줘야 할 부분은 apue.2e/ipp,h에서 status라고 define 되어 있는 부분이다.



어딘지는 모르겠는데 아마 기존에는 status라고 되어 있던 부분이 다른 어딘가에서도 정의되어 있어서 발생하는 error 이다. 참고로 나는 대문자를 넣어서 Status라고 바꿨다. 그리고 나서 문제가 발생하는 ipp/printd.c파일의 977번째에서 status가 사용되는 부분도 아래와 같이 바꿔줬다.



이렇게 하면 첫번째 오류는 없어진다. 두번째 발생하는 오류는 이 걸 거다.



이건 진짜 말그대로 getenv1.c에서 ARG_MAX가 정의되어 있지 않아서 발생하는 문제인데, 사실 그안에 추가되어 있는 limits.h 파일에 ARG_MAX 변수가 정의되어 있다. 다만 경로가 잘못되어 있어서 인지를 못하는 것이기 때문에 이걸 수정해줘야 한다.



마찬가지로 getenv3.c 파일에서도 위와 같이 limits.h 앞에 linux폴더 경로를 수정해준다. 


여기까지 하면 아마 예제 파일들이 제대로 생성될 것이다.


댓글