본문 바로가기

Developement

64bit compile @ windows7 w/ minGW x86 64bit

windows vista 나 xp64 또는 7 에서 64bit 바이너리를 만들기 위해서는 MS Visual Studio 2008 이 필요 합니다.
하지만 저같은 개인 개발자가 비싸디 비싼 제품을 살 수는 없죠.
집단지성 에서 빛을 발하는 것은 SourceForge 에서 나오는 다양한 Open Source Project 이겠습니다.
이중 다양한 플랫폼을 개발 해 본 사람이라면 누구나 들어 볼 만한 것이 바로 gcc 입니다.
gcc 는 GNU C Compiler 로서 리눅스에서 사용하는 컴파일러로 만들어진 Open Source Compiler 입니다.

이중 64비트로 사용할 수 있는 컴파일러는 현재 4.4.0.1 버젼이 존재 합니다.
다운로드는 SourceForge 에서 가능하며 링크는 다음과 같습니다.

일반적으로 windows 는 32비트를 x86 으로, 64비트를 x64 로 표현하는데 이는 실질 적으로 틀린 표기법 입니다.
대부분의 intel 기반 CPU 들은 x86 기반의 구조를 가지는 CPU 들로서 이 구조 자체가 32비트 레지스터를 쓰는 것인가 또는 64비트 레지스터를 쓰는 것인가에 따라 x86.32bit 또는 x86.64bit 가 맞는 표기가 되겠죠.
하지만 Microsoft 는 표준을 무시하기에 달인인지 몰라도 자신들 편리성대로 x86 과 x64 로 나눠서 단순표기 하고 있죠.

아무튼,
컴파일러만 받아서는 뭔가 할 게 없죠.
IDE 같은게 있어야 겠습니다.
콘솔에서 빌드가 가능한 분들은 make file 을 만들어서 돌릴 수 있겠습니다만, 이것이 불가능 한 분들은 IDE 를 사용해서 빌드 하는 것이 익숙해 있겠습니다. (일단 윈도우7 에서 cygwin 을 쓸 수 없습니다 ㅠㅠ)

이번에 발견한 IDE 는 MS Visual Studio 6 의 형태를 지니고 있는 Visual-minGW 라는 OpenSource project 입니다.
2008년6월 이후로 현재 업데이트가 되고 있지는 않지만 간단한 console app 를 만드는데는 지장이 없어 보입니다. (물론 winAPI 를 이용하여 GDI 를 쓰는 어플도 충분히 만들 수 있습니다)

Visual-minGW 홈페이지 = http://visual-mingw.sourceforge.net/

하지만 현재 바이너리에서는 64bit minGW 를 shell execute 할때 오류가발생 합니다.
그래서 별도로 console 에서 make 를 수행하는 것이 더욱 더 편리 합니다.
사실 Visual Studio 처럼 디버깅이 가능하지는 않습니다 ㅠㅠ

그래서 추천하는 것은 바로 CodeBlocks 라는 IDE 입니다.
현재 써본 IDE 중 가장 진보된 성능을 가지고 있으며 꾸준한 업데이트가 이루어 지고 있는 프로젝트 입니다.
다운로드는 http://www.codeblocks.org/downloads/5 에서 가능하며, 기본적으로 minGW 를 포함하는 바이너리와 IDE 만 존재하는 바이너리 두가지중 하나를 받으실 수 있습니다.
64비트 minGW 를 따로 받은 경우는 IDE 만 받으면 됩니다.

그런다음 설정은 기본적으로 GNU GCC Compiler 으로 설정 하면 됩니다.
관례적으로 minGW 는 C 드라이브의 root 에 minGW 라는 이름으로 설치 해 놓습니다.
저역시 C:\minGW 에 컴파일러를 setting 해 두었습니다.
하지만 64비트용 컴파일러는 기존 바이너리와 이름이 다르기 때문에 codeBlocks 에서 컴파일을 하기 위해서는 다음과 같이 설정을 해야 합니다.

기존 이름 앞에 x86_64-w64- 가 추가 되어야 합니다.
이정도만 세팅 하게 되면 minGW 64 로 빌드 할 준비는 완료 되었군요.
기존에 만들어 두었던 LZSS.DLL 소스를 import 하여 빌드 해 보았습니다.
DEV-C++ 로 만들었던 프로젝트라 minGW32 에서 정상 빌드 되는 것이라 64에서도 문제 없이 빌드가 완료 되었습니다.
여기서 64비트 프로그램을 만들때 주의 해야 할 점들은 다음과 같은 것들이 있습니다.
프로그래머라면 반드시 유념해야 할 것이겠죠.

machine 에 depend 한 벼수인자를 주의 해야 합니다.
int, long 과 같은 변수형들은 machine depend type 입니다.
무슨 말이냐?
이는 CPU 와 컴파일러에서 지정된 레지스터 에 따라 그 크기가 달라지게 된다는 말 입니다.
8비트 CPU 에서 int 는 8bit 입니다.
16비트 CPU 에서 int 는 16bit 입니다.
32비트에서는 당연히 32비트가 되고 64비트에서는 64비트가 된다는 의미 입니다.

단순히 수만 저장되는 정도라면 문제가 없을 수도 있겠습니다만, 이는 포인터의 주소체계도 32비트가 아닌 64비트가 된다는 의미가 되며, 혹시 변수 오버플로우를 이용하는 프로그래밍이 있다면 큰 문제가 발생하게 된다는 의미 입니다.

이런 것들을 유념 하며 프로그래밍을 한다면 별다른 노가다 없이 32비트 소스를 64비트로 옮겨 사용하는 것에 어려움이 없어 보입니다.