본문으로 바로가기

MinGW

category 카테고리 없음 2024. 6. 28. 13:26

http://www.mingw.org

http://sourceforge.net/projects/mingw/

 

MinGW: A collection of freely available and freely distributable Windows specific header files and import libraries combined with GNU toolsets that allow one to produce native Windows programs that do not rely on any 3rd-party C runtime DLLs.

 

MinGW는 GNU의 C컴파일러인 gcc의 윈도우즈 버전으로 MinGW 프로젝트로부터 최신버전을 다운로드하실 수 있습니다. MinGW를 사용하면 시중에 많이 보편화되어 있는 비주얼 C++을 사용하지 않고서도, Tcl/Tk 소스코드로부터 실행파일을 빌드할 수 있거나, Tcl/Tk의 확장 패키지를 C언어로 작성할 수 있습니다. 이 글의 작성 기준, 현재 최신버전은 5.1.3이며 패키지의 구성은 다음과 같습니다.

  • GCC-3.4.5
  • binutils-2.18.50
  • mingw-runtime-3.14
  • w32api-3.11
  • gdb-6.7.5
  • make-3.81-2 (binary renamed as mingw32-make)

MinGW는 SourceForge로부터 최신버전을 자동으로 설치할 수 있는 [Automated MinGW Installer]를 제공하고 있으며, Cygwin에도 아래와 같이 MinGW 패키지가 포함되어 있습니다.

Cygwin & MinGW

Cygwin 사용자를 위해 Cygwin으로부터 MinGW를 사용하는 방법을 알아보도록 하겠습니다. Cygwin의 최신버전을 받습니다. 최신의 Cygwin에 포함된 GNU C컴파일러(gcc)의 버전은 3.4.4입니다. Cygwin의 gcc로 컴파일을 할 경우 기본으로 cygwin1.dll에 의존하는 바이너리 파일을 생성합니다. cygwin1.dll에 의존하지 않는 바이너리 파일을 만 들 경 우는 gcc에 -mno-cygwin옵션을 지정합니다. 이때 지정된 옵션으로 인하여 MinGW 패키지의 컴파일러를 사용하여 컴파일하게 됩니다.

$ cd tcl8.4.18/win 
$ ./configure --enable-gcc --enable-threads 
$ make 

$ cd tk8.4.18/win 
$ ./configure --enable-gcc --enable-threads 
$ make

만들어진 실행파일이 cygwin1.dll에 의존하고 있는지 objdump로 확인해 봅니다.

$ objdump -p tclsh84.exe | grep "\.dll" 
   DLL Name: msvcrt.dll 
   DLL Name: KERNEL32.dll 
   DLL Name: tcl84.dll 
    
$ objdump -p wish84.exe | grep "\.dll" 
   DLL Name: msvcrt.dll 
   DLL Name: KERNEL32.dll 
   DLL Name: USER32.dll 
   DLL Name: tcl84.dll 
   DLL Name: tk84.dll

cygwin1.dll 대신 msvcrt.dll이 표시되면 의존성 문제는 없어진 것입니다. msvcrt.dll은 Microsoft사의 C런타임 라이브러리로써, Windows에 기본으로 설치되어 있는 파일입니다.

gcc의 최적화 옵션

일반적으로 gcc의 최적화 옵션은, 시중에 사용되고 있는 컴파일러보다 떨어진다고 알려져 있습니다. gcc의 최적화 옵션은 아래와 같습니다. 그 밖의 최적화 옵션은 gcc매뉴얼을 찾아보시기 바랍니다.

 

옵션 설명
-O -O1과 같음
-O0 최적화를 하지 않음
-O1 코드사이즈의 감소와 실행속도향상을 목표로 최적화함
변수를 레지스터에 할당하거나,다중조건점프의 최적화등을 행함
-O2 고도의 최적화를 하며, 대부분이 최적화가 됨.
루프전개와 함수의 인라인전개,레지스터의 rename을 하지않음.
-O3 -O2 것보다 진보된 최적화를 행함.
루프전개나 함수의 인라인 전개등도 행함.
-Os 코드사이즈를 작게 하기 위한 최적화를 행함.
-O0∼3등의 실행 속도를 향상시키는 옵션을 모두 병행할 수 있음.

 

※ 팬티엄 이후의 프로세서에 맞춰진 pgcc와 같이 -O7까지 지정가능한 컴파일러도 있습니다. 보통 컴파일러의 최적화 옵션은 프로그램의 버그를 만들어 낼 우려가 있기 때문에 -O2를 사용하는 것이 무난합니다.

CPU에 맞춘 최적화

gcc에는 CPU에 맞추어 최적화를 지시하는 옵션 -march -mcpu가 있습니다. -march는 지정된 CPU에서만 동작하는 코드를 만들어냅니다. -mcpu는 같은 계열의 CPU에서만 동작하는 코드를 만들어냅니다. 실행속도는 -march 쪽이 빠른 코드를 생성해 냅니다. 각각 -march=i686,-mcpu=pentiumpro와 같이 사용합니다. 지정할 수 있는 CPU타입은 아래와 같습니다.

 

CPU 타입 설명
i386 i386이나 그외 호환CPU
i486 i486이나 그외 호환CPU
i586 Pentium, MMX Pentium 호환CPU
i686 Pentium Pro, Pentium II, Pentium III, Pentium 4, Celeron등
pentium i586과 같음
pentiumpro i686과 같음
k6 K6, K6-2, K6-III
athlon Athlon, Athlon MP, Athlon XP

벤치마크 테스트

Microsoft사의 Visual C++로 빌드된 ActiveTcl 8.3.4.1와 MinGW로 빌드된 ActiveTcl 8.3.4.1로 벤치마크를 한 결과를 1997년에 11월에 일본에서 발표한 바 있습니다.

결과는 MinGW로 빌드한 ActiveTCL이 조금 빠른 결과가 나왔습니다.

 

환경 항목 실행시간
ActiveTcl 8.3.4.1 LINE 0.98초
PAINT 0.89초
MOVE 1.77초
TOTAL 3.64초
Tcl8.3.4 MinGW LINE 0.93초
PAINT 0.85초
MOVE 1.69초
TOTAL 3.47초

 

마지막으로 Meta CARD의 퍼포먼스 벤치마크를 한 결과입니다.

 

http://www.metacard.com/ide6.html

 

이 결과는, MinGW로 빌드한 버전이 약간 느린 결과가 나왔으나, 이것은 어디까지나 오차를 생각하지 않을 수 없습니다. 이 테스트 결과로는 ActiveTcl과 MinGW로의 빌드 버전은 막상막하의 성능으로, 충분히 실용적이라 할 수 있습니다. 결론은 내자면, MinGW는 충분히 사용가치가 있는 툴이라 생각됩니다.