개요
윈도우 프로그램은 윈도우에서, 맥 프로그램은 맥os에서 만들어진다. 즉 컴파일러는 그 자신이 실행되는 플랫폼과 동일한 환경 에 대응하는 실행 코드를 생성한다.
그러나 안드로이드나 임베디드 시스템은 어떨까? 일반적으로 모바일 앱을 모바일에서 개발하지는 않는다. 이럴 때는 크로스 컴파일러 (cross compiler)를 사용한다. 다른 플랫폼 또는 아키텍처에서 실행 가능한 코드를 생성하는 녀석이다.
필자는 전에 구성했던 code-server에서 윈도우 프로그램을 개발하고 싶었기 때문에 필연적으로 크로스 컴파일러와 마주하게 되었다.
크로스 컴파일러 설치
리눅스에서 사용하는 C 컴파일러는 gcc가 있다. gcc의 윈도우 버전은 mingw라고 한다. 즉 비 윈도우 환경에서 mingw를 설치하면 바로 크로스 컴파일러가 되는 것이다.
다음 명령어로 우분투에서 mingw를 설치한다. ARM CPU인데도 다행히 설치가 된다.
sudo apt-get install mingw-w64
이제 gcc 대신 x86_64-w64-mingw32-gcc를 사용할 수 있다. 이외에도 build-essential에서 지원하는 도구 앞에 x86_64-w64-mingw32-를 붙이면 윈도우 64비트 타겟으로 실행된다.
사용할 일은 없겠지만 윈도우 32비트를 타겟으로 하려면 i686-w64-mingw32-를 사용하면 된다.
raylib 사용하기
C 라이브러리의 묘미(?) 중 하나로, 사용할 라이브러리는 직접 빌드하는 전통(?)이 있다. 컴파일 결과물이 아키텍처 종속적이므로 본인 환경에 맞는 파일을 사용할 필요가 있는 것.
먼저 레이립 소스파일을 다운로드한다.
git clone https://github.com/raysan5/raylib.git && cd raylib/src
이제 빌드하자. 라이브러리 또한 mingw로 빌드해야 한다는 점에 유의하자.
make PLATFORM=PLATFORM_DESKTOP CC=x86_64-w64-mingw32-gcc
OS=Windows_NT 옵션을 넣어줘야 하는지 의문이 들어 이것저것 실험해봤는데, 결과물에서 바뀌는 것은 없었다. Makefile을 뜯어 보니 컴파일 시 플래그 설정에 관여하는 것처럼 보이니 알다가도 모를 노릇.
여기서 나온 헤더파일과 정적 라이브러리를 따로 빼자.
mkdir ~/project0 && mkdir ~/project0/Include && mkdir ~/project0/Lib
cp libraylib.a ~/project0/Lib/
cp *.h ~/project0/Include/
최종 파일 구조는 아래처럼 된다.
.
├── Include
│ ├── config.h
│ ├── raylib.h
│ ├── raymath.h
│ ├── rcamera.h
│ ├── rgestures.h
│ ├── rlgl.h
│ └── utils.h
└── Lib
└── libraylib.a
프로젝트 테스트
본격적으로 컴파일 및 빌드 테스트를 해 보자.
main.c 작성
project0/ 폴더에 main.c를 생성하고 기본 코드를 작성한다.
~/project0$ vim main.c
#include "raylib.h"
int main(void)
{
const int screenWidth = 800;
const int screenHeight = 450;
InitWindow(screenWidth, screenHeight, "raylib [core] example - basic window");
SetTargetFPS(60);
// Main game loop
while (!WindowShouldClose())
{
BeginDrawing();
ClearBackground(RAYWHITE);
DrawText("Congrats! You created your first window!", 190, 200, 20, LIGHTGRAY);
EndDrawing();
}
// De-Initialization
CloseWindow();
return 0;
}
Makefile 작성
~/project0$ vim Makefile
CC = x86_64-w64-mingw32-gcc
TARGET = main
$(TARGET) : $(TARGET).c
$(CC) $(TARGET).c -o $(TARGET).exe -Wall -O1 -mwindows -I Include/ -L Lib/ -lraylib -lopengl32 -lgdi32 -lwinmm
clean :
rm *.o $(TARGET).exe
빌드
~/project0$ make
폴더에 생성된 make.exe를 윈도우 컴퓨터에 옮겨서 실행해 보면,

된다…?

여담
생각보다 쉽게 성공해버렸다. 알 수 없는 불안감에 휩싸인다.
…아무튼, code-server와 연동하는 건 다음 포스트에서 다루는 게 좋겠다.
그럼 다음에,
Gabriel-Dropout
at 07:21