Media Log

ACE 6.0 static build

2011.03.06 17:37 | Softwares
ACE는 세상에서 가장 유명한 네트워크 프로그래밍 라이브러리이다.
여러 플랫폼에서 동작 할 수 있도록 설계/구현 되었고, 윈도우 사용자가 비주얼 스튜디오에서 쉽게 빌드할 수 있도록 솔루션 파일들까지(VC7,8,9,10) 제공해주는 서비스 정신도 갖추고 있다.

얼마전에는 ACE의 버전이 5.6에서 6.0으로 메이저 업데이트 되었다. 그런데 기존에는 static 라이브러리로 빌드하기 위한 솔루션 파일을 따로 제공해주었었는데 6.0 부터는 static 관련 sln 파일들이 없어져버렸다.

뭐지, 내가 직접 만들어 쳐넣으라는 소리인가. 서비스 정신이 사라졌나.
할 수 있는 다른 방법을 분명히 제공해주었을 것 같아서 여기저기 알아보다가 아래의 뉴스그룹 쓰레드에서 그 방법을 찾았다.
http://groups.google.com/group/comp.soft-sys.ace/browse_thread/thread/1eb2a24108d2b1c1#

자신이 원하는 솔루션 파일을 생성해주는 Perl 스크립트가 제공되는데 다음처럼 이용하면 된다.
..\ACE 6.0.1\ACE_wrapper\ace> ..\bin\mwc.pl -type vc10 -static

윈도에서 Perl을 설치하기 싫으면 근처에 접근할 수 있는 아무 리눅스로나 잠시 옮겨가서 만들어와도 되겠다.

저작자 표시 비영리 동일 조건 변경 허락
신고
  1. kwon at 2011.03.21 14:41 신고 [edit/del]

    덕분에 ace 6.0으로 쉽게 업데이트 했어요~ㅎㅎ
    타이밍이 딱 맞았네요~~ 덕분에 stack overflow에 있는 글들도 봤는데..
    도움이 되는 글들이 많이 있네요~ㅎ
    요즘 글이 많이 올라와서 좋아요~^^

    Reply

submit
Jeffrey RichterWindows via C/C++ 예제 코드에는 공통 헤더파일이 있는데, 이 곳을 살펴보면 유용하게 사용할 수 있을만한 팁들이 많이 있다.

그 중 가장 쉽고 편하게 쓸 수 있는 기능 하나를 소개하고자 한다.

코드를 작성하다가, '이 부분은 나중에 고쳐야지' 하고 주석으로 마킹해 놓은 뒤에 나중에 잊어버리고 그대로 릴리즈했던 경험이 있는 사람이라면 이 매크로를 아주 좋아하게 될 것이다.

그의 예제코드 중 CmnHdr.h 라는 파일을 보면 다음과 같은 코드가 있다.

//// Pragma message helper macro ////
/* 
When the compiler sees a line like this:
   #pragma chMSG(Fix this later)

it outputs a line like this:

  c:\CD\CmnHdr.h(82):Fix this later

You can easily jump directly to this line and 
 examine the surrounding code.
*/

#define chSTR2(x) #x
#define chSTR(x)  chSTR2(x)
#define chMSG(desc) message(__FILE__ "(" chSTR(__LINE__) "):" #desc)


주석에 잘 쓰여 있듯이 Pragma 지시어를 이용해서 코드 어떤 부분에,
#pragma chMSG(나중에 고칠 것)
int c = a + b;
이런 식으로 주석 대신 적어두는 것이다.

이제 빌드를 하게 되면, Output 창에 이 메세지가 나타나게 되므로 실수를 줄일수 있다.
또한 에러나 경고 메세지와 같이, 더블 클릭 하게되면 해당라인으로 바로 이동하게 된다. 이것은 pragma message의 기능이 아니라, Jeffry가 매크로에 파일과 라인수를 Output창이 알아볼 수 있는 형태로 잘 정의해두었기 때문이다.

하지만 그럼에도 불구하고, 빌드 되는 동안 다른 경고들이 화면 가득 나와서 아예 경고 메세지를 쳐다보지 않는 사람들에게는 혜택이 없다.

이 지시어는 아주 유용하긴 하지만 나는 조금 더 쓰기 편하도록 다음과 같이 매크로로 고쳐서 사용하고 있다.
 
#define chSTR2(x) #x
#define chSTR(x)  chSTR2(x)

#define chMSG(desc) message(__FILE__ "(" chSTR(__LINE__) "): --------" #desc "--------")
#define chFixLater message(__FILE__ "(" chSTR(__LINE__) "): --------Fix this later--------")

#define FixLater \
    do { \
    __pragma(chFixLater) \
    __pragma (warning(push)) \
    __pragma (warning(disable:4127)) \
    } while(0) \
    __pragma (warning(pop))

#define MSG(desc) \
    do { \
    __pragma(chMSG(desc)) \
    __pragma (warning(push)) \
    __pragma (warning(disable:4127)) \
    } while(0) \
    __pragma (warning(pop))



우선은 코드 중간 중간에 #pragma를 쑤셔넣는 것이 보기가 싫었는데, 이 pragma를 매크로 안으로 넣어버렸다. MSVC에는 __pragma라는 키워드를 사용할 수 있는데, 매크로 안에서 pragma 지시어을 사용하기 위해 고안되었다.
만일 예전에 매크로를 만들다가 매크로 안에 #pragma 지시어까지 넣을 수 없을까 고민했던 적이 있던 사람에게는 아주 좋은 소식일 것이다.

또 하나는 코드 맨 끝에 세미콜론을 붙여야 컴파일 되도록 강제하였다. #pragma 지시어는 C문법이 아니므로 세미콜론을 써줄 필요가 없는데, 코드 중간 중간에 들어갈 매크로인만큼 세미콜론이 없으면 미관상에도 안좋고, 복사해서 붙여넣기 등을 할 때 들여쓰기가 깨져버리는 문제가 있다.

그래서 보통 매크로를 만들 때는 세미콜론을 꼭 붙여야 정상적으로 컴파일 되도록 작성하는 것이 좋은데, 위 매크로에서는 do while 얍삽이를 통해서 세미콜론을 강제하고 있다.
저 얍삽이는 Ace 프레임워크의 ACE_DEBUG 매크로를 살펴보다가 알게 된 것인데, 세상에는 참 얍삽하게 머리 좋은 사람들이 많구나 하는 생각을 했다.
농담이다.

do while 얍삽이를 쓰게되면, while(0) 때문에 경고가 발생하는데, 이 역시 __pragma로 감싸버려서 없앨 수 있다.

마지막으로 앞뒤로 ----를 붙여서 좀 더 눈에 띄기 쉽도록 하였다.

이제 다음과 같이 사용할 수 있다.

#pragma chMSG(블라블라블라)
int main()
{
    FixLater;
    int a;

    MSG(나중에 고칠 것);
    return 0;
}

신고
  1. Favicon of http://eslife.tistory.com BlogIcon eslife at 2010.01.14 23:28 신고 [edit/del]

    재호님 글 잘 봤습니다.
    저도 가끔씩 이용하는 방식인데.. 재호님처럼 매크로와 얍샵이 방법까지 활용할 생각은 못해 봤습니다. 좋은 방법 배우고 갑니다 ^^

    Reply
  2. Favicon of http://www.voiceportal.co.kr BlogIcon 김태정 at 2010.01.21 00:43 신고 [edit/del]

    오호~ 오랜만에 글?? ㅎㅎ

    Reply

submit