Cogito, Ergo Sum, 나는 생각한다. 고로 나는 존재한다. --데카르트
- 정말 간단합니다. 예전에 빌드했던 과정을 각색해서 적어보겠습니다.
1 mingw를 사용해서 Win32상에 ACE를 빌드하고 설치하기 #
- msys를 mingw 배포본과 같이 설치합니다. (cygwin에서 주로 작업하더라도 라이브러리 빌드는 msys를 추천합니다.)
- ACE 배포본을 적당한 곳에 압축을 풉니다. (mingw디렉토리내에 넣는 것은 별로 좋은 생각이 아닙니다. 가급적 C:나 D: 루트에 가깝게 풀어놓으시길...)
- msys를 실행합니다. 다음과 같이 입력하여 ACE_ROOT 환경변수를 설정합니다. (아래 예제는 C:\ACE_Wrappers에 설치되었다는 것을 가정한 것입니다. /을 사용한 것에 주의!)
export ACE_ROOT=c:/work/mingw/ACE_wrappers
- 이제 ACE_ROOT환경변수가 사용가능한지 테스트 해봅니다. (이후 설명에서 $ACE_ROOT라고 적은 부분은 ACE 배포본 디렉토리로 간주하겠습니다)
echo $ACE_ROOT
- $ACE_ROOT/ace로 이동해서 config.h라는 이름의 text화일을 하나 만듭니다. 그리고 다음과 같이 입력합니다.
#include "ace/config-win32.h"
(ACE 최신버전에서 이전의 ssize_t설정 버그 해결한것 같습니다. 원래대로 두면 컴파일됩니다) 만약 win98/ME에서 사용가능하게 빌드하려면 다음을 추가합니다. (일반적으로 안쓰는 것이 좋습니다. 이 옵션을 쓰면 Completion Port와 같은 기능은 모두 사용하지 않게 됩니다.)#define ACE_HAS_WINNT4 0
- $ACE_ROOT/include/makeinclude 디렉토리로 이동해서 platform_macros.GNU라는 화일을 하나 만들고 다음과 같이 적습니다.
include $(ACE_ROOT)/include/makeinclude/platform_mingw32.GNU
귀찮으시면 그냥 다음과 같이 해도 됩니다.cp platform_mingw32.GNU platform_macros.GNU
- 이제 $ACE_ROOT/ace 디렉토리로 이동해서 make 합니다. 그냥 하면 ACE.DLL이 생성됩니다. 물론 다음과 같이 실행해서 정적라이브러리로 빌드할 수 있습니다.
make static_libs=1
디버그정보가 포함되면 결과 DLL또는 lib화일의 크기가 꽤 큽니다. 줄일려면 디버그 정보를 없애야하는데, ACE자체의 버그를 잡을것이 아니라면 디버그 빌드는 필요가 없습니다. 다음과 같이 하면 디버그정보를 없애고 최고 수준의 최적화(-O3)로 컴파일합니다.make optimize=1 debug=0
- 열라 오래걸립니다.
(밥이라도 먹고 오는 것이 좋습니다. 제 PC는 펜3 866인데 거의 1시간이 넘게 걸리더군요. 그래도 VC보다는 덜 걸립니다.) 컴파일된 결과 화일들은 모두 $ACE_ROOT/ace에 있습니다. 다음과 같이 경로에 풀패스로 잡아주는 것이 좋습니다.
export PATH=/c/ACE_wrappers/ace:$PATH
2 ACE TESTS #
- 테스트 예제는 $ACE_ROOT/tests에 모두 담겨져 있습니다. 위의 빌드 단계가 모두 끝났으면 $ACE_ROOT/tests으로 이동해서 그냥 make 하시면 됩니다.
- 다 되었으면 다음과 같이 적어 테스트들을 실행해봅니다. DLL을 빌드했다면 예제디렉토리로 libACE.dll을 복사하거나 PATH를 잡아주는 것이 좋습니다.
run_tests.sh
3 컴파일 팁 #
- g++로 컴파일할 때 -D_MT옵션을 붙여줍니다. (multithread 방식으로 컴파일한다는 뜻)
- 링크시 -lACE.dll -lws2_32와 같이 winsock2 라이브러리를 링크해주어야 합니다.
- SDL이나 MFC, wxWindows와 같은 라이브러리는 스스로 main() 함수를 약간 오버로딩해서 전처리와 후처리를 실행하는 기법을 사용합니다. 이런 라이브러리와 ACE는 컴파일시 충돌이 일어날수 있는데(main() 함수가 중복선언되었다는 warning이 발생) 이를 방지하려면 다음과 같이 합니다.
- 다음을 $(ACE_ROOT)/ace/config.h의 가장 첫줄에 적어줍니다.
#define ACE_DOESNT_INSTANTIATE_NONSTATIC_OBJECT_MANAGER 1
- 프로그램 작성시 main() 함수 맨 처음과 종료시 다음과 같은 코드를 추가합니다.
... int main(int argc, char **argv) { ACE::init(); ... ACE::fini(); return 0; }
- 다음을 $(ACE_ROOT)/ace/config.h의 가장 첫줄에 적어줍니다.









![[http]](/wiki/imgs/http.png)
