윈폼 프로그램을 맥, 리눅스에서 빌드하기(?!)

마이크로소프트가 오픈소스 프로젝트를 진행하면서 모노(Mono)를 이용한 크로스플랫폼 지원한다는 이야기를 많이 들었을 것이다. 사실 모노로 가지고 그대로 개발한다면서 Gtk#을 이용하고 하는 사람들도 있고, Xamarin을 결재해서 하는 사람들도 많다.

근데 기존에 Visual Studio를 통해 개발했던 프로젝트들, 특히 윈폼 프로젝트의 경우에는 코드 변환을 해야 하는지 그대로 이용해야 하는지 모르는 사람들이 많다. 국내에서 아직 Mono를 많이 쓰는 걸 본 적이 없어서 그런지 정보도 별로 없다. 있어도 대부분 모바일 크로스플랫폼을 위해 이용하던 방법들이 많고…

게다가 전에 윈도우 프로그래밍을 하라고 했을 때에도 “그럼 맥용, 리눅스용 따로 만들어야되요?” 라고 질문도 받긴 했다. (사실 자바 쓰면 그럴 일 없겠지만… 개발에 환경설정에 이런 저런 시간 좀 더 덜쓰는 쪽을 먼저 알려주고 싶었을 뿐이었고, 실제로도 쓸 수 있는 걸 보여주고 싶으니깐.)

간단하다 xbuild 명령어를 통해 직접 빌드를 진행하면 된다.

스크린샷 2016-03-10 오후 12.57.54

*주의: xbuild의 경우에는 make와 같은 빌드 명령처럼 쓰이기 때문에 모노를 전체 설치한 경우에 이용하기 쉽다. 맥의 경우에는 pkg를 통해서 설치했으면 별 문제 없겠지만, 리눅스의 경우에는 만약 전체 설치 안되어있다면 전체 설치를 권장한다.

사용법을 맥북에서 녹화해서 직접 유튜브에 올렸다.

실행 동영상

이로써 맥, 리눅스에서 이용할 수 있는 방법을 공유했다. 단, 이걸로도 지원이 안되는 부분이 있다.

  • 프로젝트 내부에 있는 COM 레퍼런스 파일들은 무시된다.
  • VC++, vdproj(Setup and Deployment) 프로젝트의 경우에는 지원되지 않는다.

즉, 간단하게 보면 C#으로 짠 프로그램에 한해서만 보면 된다. 자세한 내용은 아래의 링크 주소를 통해서 확인할 수 있다.

http://www.mono-project.com/docs/tools+libraries/tools/xbuild/

윈도우 프로그래밍은 꼭 정품 비주얼 스튜디오를 써야 하나?

http://www.visualstudio.com/ko-kr/products/visual-studio-express-vs

비주얼 스튜디오 익스프레스를 MS에서 제공해 주고 있습니다. MS는 자사의 익스프레스 제품을 통해 개발할 때 자신들의 익스프레스 제품을 이용하여 자유롭게 개발을 해볼 수 있도록 지원해 주고 있죠.

근데 이게 골때립니다. 상용 비주얼 스튜디오가 상당히 비싸기 때문에 회사에서 익스프레스로 개발해서 쓰는 상황을 볼 때가 있긴 합니다. (대놓고 익스프레스로만 개발하라는 사장도 있습니다. 진짜로)

그래서… 무지하게 관련 내용을 뒤져본 적이 있습니다. 일단 결론부터 적겠습니다.

결론: 회사에서 프로그램 창작을 할 때 익스프레스 버전을 사용해도 되나, 익스프레스로 개발한 프로그램을 회사에서 상업적 용도로 배포할 수는 없다.

MS랑 상의하던가 MSDN 구독해 주세요. ㅡㅅㅡ 소규모 기업이면 아마 싸게 지원해 주는 것도 있는 걸로 알고있습니다.

그러나, 자유로운 창작을 위해 써도 된다는 건 공부할 때 써도 된다는 내용입니다. ㅇㅅㅇ 공부할 땐 라이센스 제약 덜받는 익스프레스 버전 써주세요. 그게 나중에 본인한테 피해 덜받는 방법입니다. MS는 상당히 라이센스에 민감한 기업입니다.

갑자기 뜬금없이 이 글을 왜 썼냐고 물으실텐데… 제가 예~전에 C#과 닷넷 공부할 때, 몇몇 영문 사이트에서 알려준 방법이 한국에서는 아직 들어오진 않았는데, 그 내용 보고 질문하는 사람 생길까봐서 그렇습니다.

익스프레스 버전을 받고, 그 안에 같이 설치되어 나오는 CSC(C# Compiler)를 가지고 커멘드 라인에서 컴파일해서 공부하는 방법을 써놓은 글들이 상당히 많습니다. 저게 어디까지 가냐면요… 메모장으로 코딩해서 프로그램 뚝딱 짜놓고 릴리즈 판으로 빌드까지 완전히 끝내는 방법도 나옵니다. 그걸로 멋대로 배포하는 글도 있긴 한데.. 지금은 찾기 힘들군요.

근데 중요한 건, 저건 그냥 지인들끼리 잠깐 돌리고 하는 방법으로 쓰는 것 중 하나일 뿐입니다. 아님 단순히 이렇게도 쓸 수 있다고 알려주는 용도이거나요. ㅡㅅㅡ (여러분이 찰스 페졸드 아저씨처럼 MSDN의 모든 내용을 다 머릿속에 넣어두고 있다면 그렇게 프로그래밍 해도 됩니다만 그래도 상업 배포는 안됩니다. ㅇㅅㅇ) 실제로 돈을 받고 배포할 목적이라면 비주얼 스튜디오 정품을 구하시거나 MSDN을 구독하세요.

p.s. 규링도 MSDN 구독중입니다.

CTS, CLS에 대한 부가적 설명

CTS, CLS에 대한 설명을 하긴 했습니다만 이해가 잘 안가실 겁니다.(저도 잘 안갔습니다) 그래서 관계도를 올립니다.

CLS는 개발자가 짜는 프로그래밍 언어가 어떤 것이던 간에 닷넷에서 동작하기 위한 최소한의 규약을 나타내는 것입니다. 이 부분에 대해서는 MS C++, C#, VB.NET을 배울 때 공통적으로 가르치는 부분입니다. 당연히 C++, VB, C#의 순수한 언어적인 측면을 배울 때는 눈에 띄지 않는 부분입니다. 스스로 직접 윈도우 환경에서 동작하는 프로그래밍을 하다보면 하나 둘 씩 등장하는 개념이니 천천히 배우면 됩니다.

CTS는 보시면 아시겠지만 언어에 상관 없는, 즉, 닷넷 프레임워크 환경에서 제공되는 데이터 형식, 런타임 구조 등등의 환경이 정의되어 있는 구조입니다. C++로 개발을 한다 하더라도 32비트 운영체제와 64비트 운영체제에 따라 데이터 형식이 달라지는 점이나, 플랫폼에 따라 데이터 형식에 약간의 차이가 발생할 수 있는 점 등등 여러가지 차이점이 있을 수 있습니다. 실행 환경에 대한 고려는 중요한 겁니다. 그런 환경에 대한 정의를 하고 있기 때문에 상당히 중요한 내용을 가지고 있는 것이죠. (프로그래밍을 시작하신 분들이나 일반 응용 프로그램 개발 시에는 데이터 형식에 대해 깊게 따지지 않는 경우가 많아 쉽게 넘어가는 경우가 많습니다. (것보다 따지면서 개발해야 하는 환경이 특수한 환경인데… 할 줄 아는 사람 많은가? ㅡㅅㅡ))

그리고 환경이 언어에 영향을 받지 않아야 하므로 모든 언어에 공통적으로 적용하고 있습니다. 그래서 여러 언어를 지원하면서도 동일한 형식을 이용할 수 있는 것이죠. ㅇㅅㅇ

.net Framework 간단히 보기

음… 닷넷 프레임워크를 무지 간단하게 볼 수 있는 방법이 뭐 있을까 했습니다만… 마침 좋은 게 떠올랐군요.

.net Framework. 핵심 요소만 보고 넘어가죠. 주 핵심 요소는 CLR, BCL, CTS, CLS로 정리할 수 있겠습니다.

  • CLR: 닷넷 프레임워크의 핵심 주으이 핵심입니다. 코드를 실행하고 메모리를 자동 관리하며 형식의 안정성을 보장하는 등 여러 가지 실행 환경을 제공합니다.
  • BCL: 닷넷이 제공하는 여러 가지(GUI, 웹, DB연결, 보안 등등) 클래스 라이브러리입니다.
  • CTS: 닷넷의 모든 데이터 형식이 기술되어 있으며, 런타임 프로그래밍 구조가 정의되어 있는 부분이다.
  • CLS: 닷넷의 모든 언어가 지켜야 하는 형식에 대한 일련의 규약으로써, CLS 규약을 지펴 만들어진 형식이라면 어떤 닷넷 언어에서도 사용할 수 있게 됩니다. 이전에 닷넷은 여러 언어가 쓰이지만 형식이나 방법만 제대로 지킨다면 어떤 언어를 써도 상관 없다고 했습니다. 그게 이겁니다. ㅇㅂㅇ

이걸 한 큐에 정리한 것이 아래의 구조입니다.

어셈블리(Assembly)

어셈블리 하면 다들 어셈블리어랑 어셈블러가 생각날지도 모르겠군요…ㅇㅂㅇ;;;

어셈블리는 닷넷의 컴파일된 모듈로 버전 관리되는 배포의 단위입니다. 프로그램 시작 진입점(main 함수)을 가지고 있는 exe 파일과 다른 프로그램으로 시작되는 dll 확장자를 가지고 있습니다. 또 여러 파일로 이루어진 다중 파일 어셈블리와 하나의 파일로 이루어진 단일 파일 어셈블리로 나눌 수 있으며 하나의 응용 프로그램에서 사용하느냐 여러 응용 프로그램에서 사용하느냐에 따라 전용 어셈블리와 공용 어셈블리로 나눌 수 있습니다. 근데 대부분 보는 것은 단일 파일 어셈블리입니다. 이건 좀 더 나중에 다룰 수 있으면 좋겠군요.

위의 그림이 어셈블리 구조입니다.

  • 메니페스트: 어셈블리 자체의 정보를 갖는 메타데이터. 이 어셈블리가 또 다른 어떤 어벨블리를 참조하는지부터 사진에 대한 정보를 모두 담고있다.
  • 형식 메타데이터: 어셈블리에서 사용하는 모든 형식에 대한 구체적이고 자세한 정보를 가지고 있다. 형식 메타데이터 덕분에 리플렉션 기능이 가능하다.
  • CIL 코드: Common Intermediate Language의 약자로, 모든 닷넷 언어들이 만들어 내는 중간코드이다. 이 중간코드는 실행 시 Just-In-Time(JIT)에 의해 네이티브 코드로 변환된다.

닷넨 어셈블리는 CIL 코드라는 중간 코드를 가지고 있다고 했습니다. 그럼 이 구조도 한번 봐야죠. ㅇㅅㅇ

위의 구조가 각각의 닷넷 언어의 컴파일러와 Jitter 컴파일러 구조를 보여주는 구조도입니다. 각 닷넨 언어의 컴파일러는 동일한 어셈블리를 만들어 냅니다. 또 이 어셈블리를 어셈블러가 사용되는 시점(실행 시간)에 단 한번(캐싱) 네이티브 코드로 변환합니다. (이 말은 즉, 동일한 논리적, 구조적으로 프로그램을 작성한다면 작성 언어에 대해 굳이 따지지 않는다는 것도 있습니다. ㅇㅅㅇ)

이 외에도 외부에서 라이브러리를 참조하는 과정이 클래스 로더에 있습니다. 주로 사용되는 클래스 라이브러리는 Base Class Library라는 이름으로 닷넷이 있고, 추가적인 라이브러리는 다른 dll을 참조합니다. ㅇㅅㅇ

닷넷 바이너리(.net binary)와 네이티브 바이너리(native binary)

윈도우에서 흔히 쓰는 .exe 실행 프로그램이나 .dll 이란 동적 링크 라이브러리들을 가지고 바이너리라고 부릅니다. 보통은 그냥 똑같이 C:\에 존재하기 때문에 파일만 봐서는 구분이 되지 않습니다.

이 둘을 구분하는 건 바로 실행 환경을 보고 구분합니다. .net 응용 프로그램은 CLR(Common Language Runtime)이라는 닷넷의 구성 요소 중 하나에서 동작합니다. CLR 위에서 실행되며, CLR에 의해 관리됩니다. 메모리, 스레드, 원격 서비스, 보안, 형식 안정성 등의 거의 모든 관리가 CLR에 의해 관리됩니다. 그래서 .net 응용 프로그램은 Managed Program이라고도 합니다.

이쯤 되면 대충 뭐랑 비슷해 보이긴 하죠? JVM이 떠오르셨다면 정답입니다. CLR은 닷넷의 핵심 요소로써 JVM과 유사한 역할을 합니다.

C#

C#

공부하기 어려운 언어는 아닙니다. 특히 자바를 공부했던 분들이라면 더더욱 어렵지 않습니다. 객체 지향 언어들은 거의 공통적인 특성을 가지고 있기 때문에 공통적인 부분만 한 가지 언어로 익혀두고, 다른 언어를 배울 때는 그 차이를 매워가는 형식으로 알아두면 되기 때문입니다. 문법의 쓰임새는 그냥 보고 따라하기 나름입니다.

근데 C#은 왠지 좀 다른 세계의 이야기를 하는 거 같은 책들이 많습니다. MS에서 만들어서 윈도우에서만 쓰이니깐요? 그런 것도 있지만.. C#이 객체 지향 프로그래밍을 위한 언어인 것 뿐만 아니라 닷넷(.net)에 대해서도 좀 더 잘 알아둬야 한다는 점이 있습니다. 이 점이 유명하게 작용하면서도 타 플랫폼 개발자들이 요즘 윈도우 프로그래밍을 할 때 어렵게 느끼는 점입니다.

MS는 윈도우의 환경을 점차 통합해 가는 시기를 계속 거쳐왔습니다. 그리고 그 중심에 있는 것이 바로 닷넷 프레임워크(.net Framework)입니다. 닷넷 프레임워크는 클라이언트용 윈도우 뿐만 아니라 윈도우 서버 및 클라우드(애저 서비스), XBox와 Windows Phone에까지 적용될 정도로 수많은 MS 플랫폼에 적용됩니다. 그만큼 사용 범위도 넓기 때문에 요즘의 윈도우 프로그래밍을 위해선 알아둬야 합니다.

저도 다시 쓰면서 복습해야 하니 천천히 보죠. ㅇㅅㅇ

리눅스와 C

리눅스의 대부분이 C언어로 작성되었고, 리눅스 수많은 어플리케이션을 C로 작성한다. 실제로 C로 작성된 프로그램도 상당수 존재한다. 따라서 리눅스 프로그래밍은 C프로그래밍을 의미한다. (거의 일반화된 예기)

또한 C 프로그래밍을 위한 환경을 리눅스에서는 기본적으로 제공하고 있다. C 컴파일러인 gcc, C 디버깅 툴인 gdb, C 컴파일 자동화 툴인 make 등을 기본적으로 제공한다.

결국 리눅스 환경에서 프로그래밍을 한다면 C는 계속 이용하게 될 것이다.

요즘 많은 언어들이 있어도 C는 안쓸 수 없을 것이다.

C언어

C언어는 제디느 리치와 켄 톰슨이 벨 연구소에서 유닉스를 개발하던 중 1972년 데니스 리치에 의해 개발되었다. 그리고 유닉스도 C언어로 구현되었다. 이러한 C언어는 뛰어난 기능과 융통성을 제공함으로써 여러 곳으로 빠르게 보급되어 많은 프로그래머(특히 1학년들…)에 의해 사용되기 시작하였다. 그러나 많은 프로그래머들이 자신이 사용하기 편리하게 C언어를 수정하기 시작하여 프로그램간에 호환성이 결여되고 표준 라이브러리 함수마저도 조금씩 달라지는 문제가 발생하였다. 이런 문제점을 해결하기 위해 ANSI에서는 1983년에 C 표준화를 위한 위원회를 결정했고, 1989년 ANSI 표준 C라고 알려진 표준안을 발표했다.

이러한 C언어는 유닉스, 리눅스와 같은 대부분의 시스템 소프트웨어를 구현하는 언어로, 고급 언어이면서 저급 언어처럼 비트나 바이트 처리, 그리고 포인터에 의한 주소 처리를 한다. 그리고 PC에서부터 대형 컴퓨터에 이르기까지 모두 사용할 수 있는 이식성이 뛰어난 언어다. 또한 구조화되어 있어 같은 기능을 구현하는 다른 언어보다 프로그램 코드 길이가 짧다는 장점이 있다. 이러한 장점 때문에 C언어의 명성은 앞으로도 계속 갈 것이다.