[Objective-C] 윈도에서 Objective-C 2.0 컴파일하기 (Clang)

Dev-CppGnuStep for win32를 사용하면 윈도 환경에서도 Objective-C 코드를 컴파일 할 수 있다. (GnuStep이 AppKit을 100% 지원하지는 않지만 흠흠..) 그런데 Dev-Cpp에서 사용하는 gcc는 Objective-C 2.0의 문법을 제대로 컴파일하지 못한다.

예를 들면 NSAutoreleasePool 객체를 사용하는 대신 @autoreleasepool{ } 블럭을 사용한다거나, @(23+1)과 같은 리터럴 문법, ^(void){ } 과 같은 코드 블럭은 컴파일 오류를 낸다. gcc 4.5부터인가 Objective-C 2.0을 지원한다고 하는데 MinGW의 최신 버전에서도 제대로 컴파일이 안된다.

Apple에서 주도하는 최신의 llvm을 사용하면 되지 않을까하고 찾아봤는데 llvm과 clang을 윈도에서 컴파일하는 방법이 있기는 있다. 하지만 이건 너무 거대한 작업이라 엄두가 안날 뿐이고..

그런데 찾아보니 llvm 홈페이지에 3.1부터는 실험적으로 윈도 플랫폼용 pre-compiled 바이너리를 제공하고 있네? 오잉?

http://llvm.org/releases/3.2/clang+llvm-3.2-x86-mingw32-EXPERIMENTAL.tar.gz

위 주소를 클릭, 적절한 위치에 압축을 풀어주면 그 속에 clang.exe가 포함되어 있다. 이 경로를 Path에 포함시켜 주면 된다. (만약 잘 안되면 홈페이지에서 3.1 버전의 바이너리를 다운로드 받으면 됨)

테스트

명령 프롬프트를 열고 테스트.

>copy con test.c
#include
int main(void)
{
printf("Hello World!")
return 0;
}

^Z
(Ctrl+Z를 누름)

>clang test.c -I c:\Gnustep\include
main.c:6:27: error: expected ';' after expression
printf("Hello World!")
                      ^
                      ;
1 error generated.

우왕ㅋ굿ㅋ. 오타로 인해 제대로 컴파일이 안되는 경우에 그거 찾느라 엄청 시간을 허비하게 되는데, 그런 건 재깍재깍 찾을 수 있다. 대신에 윈도용 Clang은 실행 시간이 엄청 걸린다. 그냥 헬로월드 컴파일하는데 평균 5~7초 가량 소요 -_-;

환경 변수 세팅

PATH 세팅에서 나의 경우에는 Dev-Cpp 폴더와 GnuStep 폴더가 모두 PATH에 등록되어 있는데, GNUStep 폴더가 먼저 오도록해야 한다. Dev-Cpp의 bin 폴더에 있는 gcc는 버전 3.x 대이기 때문에 llvm이 만드는 중간코드(IR)를 해독하지 못하고 어셈블러 관련한 오류를 내면서 컴파일에 실패한다.

Dev-Cpp 세팅

이건 Dev-Cpp Objective-C 로 구글링해보면 GnuStep과 Dev-Cpp을 설치해서 Objective-C  컴파일을 하는 방법들이 블로그에 꽤 나와있다.

이 때 컴파일러 및 링커 옵션에서 ‘-lobjc -lgnustep-base -fconstant-string-class=NSConstantString‘ 이라는 옵션은 그냥 빼도 되고 대신에 ‘-framework Foundation‘을 추가해주면 된다.

그리고 Program 탭에서 gcc 대신에 clang.exe를 찾아서 대체해준다. (시스템 환경변수에서 PATH에 해당 경로를 추가해야 하는 것도 잊지 말자)

ARC

아직 윈도용 Objective-C 런타임에서는 ARC를 제공하지 않아서 -fobjc-arc 옵션을 켜면 제대로 컴파일되지 않는다.