U E D R S I H C RSS
ID
Password
Join
하루 15분이면 40년 후엔 1,000권을 읽게 됩니다. -공익광고협의회



Contents

1 ACE를 Win32 환경의 MS VC++과 사용하도록 설치하고 빌드하기
2 ACE TESTS
3 주의사항(필독!)

1 ACE를 Win32 환경의 MS VC++과 사용하도록 설치하고 빌드하기 #


참고 : 우선 MSVC 4.x이전 버젼은 더이상 지원하지 않는다. STL을 내부적으로 사용하고 있으므로 가급적 [http]STLPort를 설치하는 것을 권장한다.

참고2 : 최신 배포본은 dsw, sln 화일을 배포본 루트에 제공합니다. 이를 사용해서 빌드하시는 것이 좋습니다.

  1. 특정 디렉토리에 ACE 배포본을 압축해제한다. 그러면 디렉토리내에 ACE_wrappers라고 하는 디렉토리가 있는 것을 볼 수 있다. ACE_wrappers 디렉토리를 다음 단계에서는 ACE_ROOT라고 칭하기로 한다 - 만일 루트 디렉토리에 압축을 풀었다면 ACE_ROOT\ace는 C:\ACE_wrappers\ace가 된다.

  2. ACE_ROOT\ace 디렉토리 내에 config.h 이란 이름을 가진 화일을 생성하고 다음 내용을 넣는다.
    #include "ace/config-win32.h"
    


  3. 다음 설명하는 옵션들은 위 "#include" 라인 위쪽에 필요에 따라 추가한다.
    1. 만일 Windows NT나 2000에서 빌드 하는 중이라면 변경사항은 없다. 하지만, Win 9x/ME상에서 빌드하는 중이라면 다음과 같은 라인을 ACE_ROOT\ace\config.h에 첨부한다. 이것은 CPIO와 같은 NT특유의 API들을 사용하는 것을 막아준다.
      #define ACE_HAS_WINNT4 0
      
    2. 표준 C++ 헤더화일(iostream, vector등등)을 사용할 예정이면 다음 줄을 추가한다. (STLPort를 사용할 경우 켜준다. 보통 반드시 해주어야 한다.)
      #define ACE_HAS_STANDARD_CPP_LIBRARY 1
      
    3. MFC 라이브러리와 ACE를 사용하려면 다음 라인을 추가한다. CWinThread를 사용하여 새로운 쓰레드를 실행하기를 원한다면, THR_USE_AFX 옵션을 가진 쓰레드를 실행해야한다는 것을 명심해라.
      #define ACE_HAS_MFC 1
      
    4. 기본적으로, 모든 ACE 프로젝트들은 MSVC 런타임 라이브러리의 DLL버젼을 사용한다. 이것은 ACE 라이브러리를 정적링크한다고 해도 마찬가지이다. 그 이유는 거의 모든 NT 운영체계가 설치된 서버에서는 런타임라이브러리가 설치되어있기 때문에 디스크 용량 절약차원에서 이렇게 처리한 것이다. 만일 ACE 라이브러리에 MFC 라이브러리를 정적 링크하기를 원한다면, 다음과 같이 선언한다. 즉, ace.dsw 프로젝트화일을 수정할 필요는 없다. (역주 : 단, 이렇게 하면 라이브러리 크기가 10M 바이트에 육박한다. O.o)
      #define ACE_USES_STATIC_MFC 1
      
    5. ACE 라이브러리의 정적 링크 버젼은 다음 옵션을 줌으로써 빌드할 수 있다. 주의! 반드시 acesd.lib, aces.lib와 같은 정적 라이브러리를 사용할 경우 이 옵션을 켜주어야하고, 동적으로 링크할 경우는 이 옵션을 꺼주어야한다. 안그러면 에러발생. -> 최신버전에서는 config.h에 넣지않고 프로젝트의 전처리기 컴파일 선언부에 적어주셔야 잘 동작합니다.
      #define ACE_AS_STATIC_LIBS 1
      
    6. 다음은 inline 함수선언을 모두 사용하지 않는다는 뜻이다. (이것은 정적 라이브러리의 크기를 감소시킨다)
      #define ACE_NO_INLINE
      


  4. ACE의 프로젝트 화일(ACE_ROOT\ace\ace.dsw)을 열어 VC를 동작시킨다.

  5. 각 프로젝트는 몇가지 다른 빌드 설정들을 담고 있을 것이다. (Debug/Release, MFC/Non-MFC, Static/Dynamic의 혼합 버젼들이라고 할 수 있다) 이제 각각의 버젼별로 빌드해준다. (역자 : 주의할 점은 보통 빌드하는데 몇 십분이 걸리며 반드시 clean을 먼저 실행하고 거는 것이 좋다) 만약, 동적 라이브러리를 사용한다면, 전체 억세스 가능한 경로에 ACE_ROOT\bin를 추가해야한다. 아니면 ace.dll, aced.dll의 두 화일을 "윈도우디렉토리\system32" 같은 위치에 복사하는 것이 좋다.

  6. ACE DLL과 LIB의 이름규약은 다음과 같다 :
    "Library/DLL이름" + (정적라이브러리인가?"s":"") + (디버그용인가?"d":"") + {".dll"|".lib"}
    


2 ACE TESTS #

이것은 ACE_ROOT\tests 디렉토리에 담겨져 있다. tests.dsw을 열고 빌드한다. batch build를 하면 더욱 편리하겠다. (프로젝트수가 좀 많다. ^_^) 모든 테스트들을 빌드했으면 UNIX계열 시스템에서는 run_test.pl을 실행하고 Win32에서는 run_tests.bat을 실행하면 된다.

3 주의사항(필독!) #

  • config.h를 수정했다면 모든 라이브러리를 다시 빌드해야만 한다. 그러므로 자주 옵션을 바꾸지 않는 것이 좋다.
  • 위 단계중에서 3번째의 4단계인 정적링크 옵션을 참조하고 옵션바꾸는거 명심하기 바란다. aced.lib냐, acesd.lib냐에 따라 반드시 바꾸어주도록 한다.
  • 반드시 ACE를 포함하는 프로젝트의 빌드옵션 중 c/c++ -> code generation -> runtime library 항목을 Debug MultiThreaded DLL로 놓도록 한다. DLL임에 주의. 그냥 Debug MultiThreaded 옵션도 안된다.
  • 윈속을 사용하는 경우에는 WSAStartUp(), WSACleanUp()을 반드시 해주어야 한다. (안하면 소켓관련 동작이 오류가 남.)
  • ACE를 사용해서 Win32 WinMain() 기반의 프로그램을 작성할 경우에는 ACE의 전역 static 객체 선언이 잘 되지 않으므로 ACE::init(), ACE::fini()를 프로그램 처음과 끝에 넣어주도록 한다. (이것은 여러번 호출할 경우, 다음 호출들은 무시되므로 여러번 실행해도 좋다. 이것을 안하면, 동기화 관련 클래스들 실행시 크리티컬 섹션관련 런타임 예외가 발생할 수 있다.) 콘솔 어플리케이션(main()기반)에서는 안해도 된다. 즉, 다음과 같이 한다.
#include <ace/ACE.h>
...
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
   ACE::init();
...
   ACE::fini();
   return 0;
}
테스트 프로젝트 빌드가 안되는데요 Test_Outputd.lib 이 없는데 어떻게 만드는 거죠?

vc에서 컴파일이 잘안되는데..

VC 버전이 어떻게 되시는지? 그리고 ACE 버전도 같이 적어주셔야 답변이 가능합니다. 가급적 AUG를 이용해주세요.

AUG가 무엇인지 한참을 생각했습니다.ㅎㅎ http://redwiki.net/aug/index.php 군요. =) 코맨트에 링크를 걸면 더 좋을것 같습니다.


햐 ace를 접한지 한달 조금 넘은 초보 입니다.. 주인장님께서 적어주신 주의사항 ( 필독 ) 을 건성으로 읽는 바람에... mfc에서 ACE::init() ; 을 안해주니 주인장님 말씀대로 task같은 동기화 프로젝트에서 크리티컬 섹션 에러가 쏟아지더군요... 분명 콘솔에서 다 테스트해서 올린건데 왜 안되는 것일 까 고민고민 하다가.. 미국 야후에 어떤 글을 검색하다 더글라스 교수님이 리플라이 해주신 글을 보구.. 그 때서야 깨달았답니다...

(그런데 알고보니 제 옆에 직원분은 그 문제로 열 받으셔서 밤을 세셨다고 하시내요 ^-^) -- Wooya 2005-04-28

하하... 삽질끝에 실력이 붙는법이죠. _ -- redpixel 2005-04-28

안녕하세요. 초보 빌더입니다. ACE 5.4.5를 다운 받아 VC7.1을 사용해서 빌드를 했습니다. 저같은 경우 특이사항으로 MFC 라이브러리와 ACE를 사용하려고 #define ACE_HAS_MFC 1를 추가 했더니 재정의 오류가 나서 빌드가 실패하더군요. 이걸 제거하고 다시 빌드했더니 아무런 문제없이 ..\..\lib/TMCastd.lib 라이브러리 및 ..\..\lib/TMCastd.exp 개체가 생성됐습니다. STL-Port같은 경우는 알아서 필요한 곳에 복사를 해줘서 VC++ 디렉토리에서 포함시켜주면 됐는데 이 녀석은어찌해야하는건지 ..\lib를 VC++폴더에 직접 복사를 해서 VC++디렉토리로 포함만 시켜주면 되나요? -- Anonymous 2005-05-29 13:07:16

저도 vc7.1을 씁니다만 MFC를 쓰지 않는지라... 한번 실험해봐야겠네요. 알게되면 따로 정리해 올리겠습니다. -- redpixel 2005-05-29 22:28:20

ACE 5.4.5 테스트 빌드시 ACE_wrappers\tests\OS_Test.cpp(723)와 ACE_wrappers\tests\OS_Test.cpp(724)에 따옴표"가 빠진 부분이 있어 에러가 나더군요. const char *test2_n = "郵晟?; const wchar_t *test2_w = ACE_TEXT_WIDE ("郵晟?); 그래서 아래와 같이 수정을 했더니 빌드에 성공했습니다. const char *test2_n = "郵晟?"; const wchar_t *test2_w = ACE_TEXT_WIDE ("郵晟?"); 아무리 테스트코드라지만 많은 분들이 심혈을 기울이셨을텐데 이런 사소한 오류가 발생해 놀랬습니다. 테스트하시는 분들 참고하시구요. 5.4.5에서 테스트 코드 실행 시키려면 ACE_wrappers\tests\pharlap\run_pharlap_tests.bat을 실행 시키면 되나요? 실행 시켜봤는데 너무 화면이 너무 빨리 지나가서 잘 된건지 잘 못 된건지 알 수가 없어 당혹스럽네요. -- Anonymous 2005-05-29 13:23:09

pharlap관련은 일반적은 x86기반 서버/어플용이라면 관련이 없습니다. 그냥 일반 test를 사용하시면 됩니다. 그리고 프로젝트가 워낙 오픈되어있고 베타라고 한다면 어느정도 changelog가 쌓이면 그냥 릴리스하는 분위기도 있습니다. 조금 중요한 프로젝트라면 안정버전을 사용하시는 것도 좋을껍니다. -- redpixel 2005-05-29 22:28:20

으악... 레드픽셀님 실험하지 마세요~~~ #define ACE_HAS_MFC 1를 추가 후 재정의 오류가 나는 이유는 제가 실수로 #include "ace/config-win32.h" 아래 #define ACE_HAS_MFC 1를 넣었기 때문입니다. #include "ace/config-win32.h"를 위에 #define ACE_HAS_MFC 1 넣으면 아무런 이상없이 빌드가 됩니다. 이미 실험을 해 보셨다면 정말 죄송합니다. -- Anonymous 2005-05-29 23:03:58

안녕하세요. 초보 빌더입니다. 빌드 후 예제 파일을 돌려 봤는데 처음엔 예제 파일에 포함된 헤더 파일을 못 찾더군요. 그래서 ..\ACE_wrappers를 VC++디렉토리 포함파일로 지정했더니 무사히 컴파일이 됐습니다. 하지만 \ACE_wrappers\ace에 보면 빌드 후에는 필요 없는 헤더 파일들도 많이 있는거 같은데 빌드 후에 계속 유지해야 할 파일들은 어떤 것들이 있나요? -- Anonymous 2005-05-30 01:10:43

아닙니다. ace 폴더안에 있는 화일은 그대로 유지하시는 것이 좋습니다. inline으로 링크되는 경우도 많이 있어서 헤더화일만 남긴다던가 하는 작업은 헛수고입니다. 그대로 두시길. :) -- redpixel 2005-05-30 02:49:24

안녕하세요. 초보 빌더입니다. 삽질의 일환으로 ACE 5.4.5를 VC6에서도 빌드를 해 봤습니다. 해 봤더니 두 군데서 구문 에러가 나더군요. std::type_info const* exp (&(typeid (*m))); ..\ACE_wrappers\ace\TMCast\Group.cpp(177) : error C2059: syntax error : '&' LinkData* data (dynamic_cast<LinkData*> (m.get ())); ..\ACE_wrappers\ace\TMCast\Group.cpp(187) : error C2059: syntax error : 'dynamic_cast' 그래서 그대로 재현도 해보고 이리저리 돌려서도(?) 해보면 항상 VC7.1에서는 컴파일이 성공하는데 VC6에서는 매번 실패를 하네요. 분명히 VC6에서도 빌드가 되니깐 릴리즈가 됐을텐데... 그 분들은 VC6에서 빌드를 어떻게 했는지 의문입니다. 지금 이것 때문에 며칠째 고민인데 함께 고민해 보는 시간을 가졌으면 합니다. 이런 고민은 싫으시다구요? 죄송합니다. _ -- Anonymous 2005-06-01 04:46:17

혹시 서비스팩 업글을 하셨는지요? vc6같은경우 대부분의 라이브러리 빌드를 하시려면 서비스팩(6까지 나왔었죠?)을 업글하시는 것이 좋습니다. 특히 vc6은 c++ 자체에 버그가 존재했었기때문에 해보시고 한번 빌드해보시길... :) -- redpixel 2005-06-01 15:52:55

안녕하세요. 초보 빌더입니다. 며칠째 저만 글을 올려서 죄송한 마음을 담을려는 의도였는데빈정거리는걸로 느끼셨다니 정말 죄송합니다. 저의 실수입니다. 주의하겠습니다. 아 그리고 서비스팩6 업그레이드 한 상태에서 빌드한겁니다. VC6의 자체 버그라면 대책이 없는건가요? 아휴 어렵네요. -- Anonymous 2005-06-01 21:26:29

흐음. vc6을 설치하기가 조금 힘든 환경이라 실험을 해서 답변드릴수 없는 것을 이해해주시기 바랍니다. vc6말고 vc.net을 써보시는건 어떨른지요? c++만 standard 버전을 구하시면 10만원대라고 알고 있습니다. -- redpixel 2005-06-01 22:45:47

안녕하세요. 초보 빌더입니다. 아휴 뭘 또 실험씩이나... 그냥 한번 흟어보자는 취지에서 이것 저것 해 보는건데 너무 많이 신경을 써 주시는거 같아서 정말 감사드리고 한편으론 죄송합니다. 그리고 한번 흟어보기만 했는데도 정말 놀랐습니다. 특히 동시처리 디자인은 경악(?)스럽습니다. _ 이 놀라운걸 국내에 소개해주신 선구자 레드픽셀님께 정말 감사드리고 ACE를 위해 헌신해 주신 모든 분들께 진심으로 경의를 표합니다. -- Anonymous 2005-06-03 13:12:21

ACE가 프레임워크 하나는 발군입니다. 나름대로의 방식이랄까... 막강한 wrapper facade 패턴구현들도 대단하다는 생각이 들죠. 10년이라는 시간이 그냥 흐른건 아니라고 생각됩니다. -- redpixel 2005-06-03 17:07:52

ace 라이브러리 소스를 컴파일 하니 ace.dll 파일이 생기더군요. 그래서 테스트 프로젝트를 실행시키니"LINK : fatal error LNK1181: cannot open input file "ACE.lib"" 이런 메세지가 납니다. lib 파일은 안생긴거 가튼데 어떻게 해야 하져? -- Anonymous 2005-06-30 11:29:47

lib화일이 안생길리가요... vc.net을 쓰시는 경우라면 반드시 생기고요. C빌더나 다른 툴은 옵션설정을 보시면 생성 옵션이 있습니다. 어떤 컴파일러로 작업하셨는지 알려주시면 좋겠네요. 그리고 가급적 메일링에 가입하셔서 질문을 해주시면 제가 더 편하게 알려드릴수 있을거 같습니다. -- redpixel 2005-06-30 12:06:51

vc 6.0으로 컴파일 했는데요... 그리구 메일링 어떻게 가입하는거져?? 그리구 lib 파일은 어디 폴더에 생가나요.. 3일간이나 컴파일하구 난리치는데 ;;; 왜케 안돼징; ㅠㅠ -- Anonymous 2005-06-30 12:50:52

안녕하세요. 5.4를 다운받아 프로젝트 속성을 확인해 보면서 몇 번이고 빌드를 해 봤는데 저도 ..\lib\에 *.lib파일이 생기지가 않네요. 이거 해결 방안 찾으셨는지 궁금하네요. 참고로 저의 config.h입니다. #define ACE_HAS_STANDARD_CPP_LIBRARY 1 #define ACE_AS_STATIC_LIBS 1 #include "ace/config-win32.h" 컴파일러는 VC7.1이구요. 속성->C/C++->코드생성->다중 스레드 디버그 DLL(/MDd)입니다. 일괄빌드 전 매번 정리를 하고 빌드를 했었습니다. -- Anonymous 2005-08-17 01:44:23

5.4.5 베타버전이전이라면 한번 ace 서브디렉토리의 vc_build라는 폴더가 생성되었는지를 보시고, 그 안을 잘 찾아보세요. 제가 vc7.1을 쓰는지라 생성이 안된다는 것이 조금... :( 배포본 루트폴더의 sln 화일로 여셨는지 다시한번 확인해보세요. -- redpixel 2005-08-17 11:16:35

안녕하세요. 오늘도 몇 차례나 빌드를 다시 해 봤는데 정말 믿기 어려우시겠지만 진짜로 lib파일이 안 생깁니다. 빌드 후 윈도우 탐색기로 모든 하드드라이브를 검색을 해 봐도 나오질 않습니다. \lib 폴더에 dll. pdb파일까지는 생기는데... 참고로 5.4 정식 버전이구요. sln 파일로 열었습니다. 그리고 포럼을 참고해서 VC6의 dsw를 변환해서 해 봤는데도 안 생깁니다. 그럼 암튼 좀 더 해 보겠습니다. -- Anonymous 2005-08-17 21:02:25

안녕하세요. 드디어 lib파일이 안 생기는 이유를 알아냈습니다. 바로 #define ACE_AS_STATIC_LIBS 매크로 때문이였습니다. 기존 config.h인 #define ACE_HAS_STANDARD_CPP_LIBRARY 1 #define ACE_AS_STATIC_LIBS 1 #include "ace/config-win32.h"에서 이리저리 순서를 바꿔봐도 #define ACE_AS_STATIC_LIBS 1을 #define ACE_AS_STATIC_LIBS 0으로 변경해도 lib파일이 안 생겼는데 아예 없애버리니깐 lib파일들이 생기더군요. 아니 근데 3번째의 5번째 단계를 보면 'ACE 라이브러리의 정적 링크 버젼은 다음 옵션을 줌으로써 빌드할 수 있다. 주의! 반드시 acesd.lib, aces.lib와 같은 정적 라이브러리를 사용할 경우 이 옵션을 켜주어야하고, 동적으로 링크할 경우는 이 옵션을 꺼주어야한다. 안그러면 에러발생.' 제가 지금 정적 링크 버젼으로 빌드를 하기 때문에 #define ACE_AS_STATIC_LIBS 1를 추가해주는게 맞는거 아닌가요? 왜 #define ACE_AS_STATIC_LIBS를 아예 삭제를 해야만 lib파일이 생기는지 알고 싶습니다. 요 며칠 빌드가 제대로 안 되 울고(?) 싶었지만 지금은 너무 기뻐 울고(?) 싶어지네요. 도움 주셔서 정말 고맙습니다. -- Anonymous 2005-08-20 00:58:08

제가 정적으로 링크해서 쓰기때문에 조금 의아합니다. 일단 위에서 글부분을 수정을 해야겠네요. ACE_AS_STATIC_LIB는 프로젝트 안에서 전처리기 옵션에서 1로 선언해주시면 되고요. (차후 ACE를 사용하는 프로젝트에서도 마찬가지) config.h에서는 안써주셔야 합니다. 글내용이 좀 오래된거라 수정을 안했는데 수정을 해두겠습니다. -- redpixel 2005-08-20 18:38:42

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:52
Processing time 0.4873 sec