첫 회부터 너무 쌘건가? 독자 분들도 제목에서 볼 수 있듯이 "크로스 플랫폼 개발 환경 만들기"라는 주제인데, 혹여 뭔가 대단한 것을 만들려고 하는 것은 아니니 너무 큰 기대는 하지 않길 바랍니다. 이 글은 필자가 크로스 플랫폼 개발 환경을 만들면서 여러 번 수행 착오를 겪은 부분을 공유하기 위함입니다.  

일단, 크로스 플랫폼 개발 환경을 만들기 위해 필자가 선택한 운영체제는 우분투 12 LTS 버전입니다. 맥OS는 리눅스 기반이면서 맥에서만 100% 설치 성공 가능한 운영체제입니다. 뭐 해적판도 있겠지만, 그런 고생은 불법적인 방법이므로 피하는게 좋겟지요.  

우분투12를 선택한 김에 우분투 운영체제에 대한 소개 좀 해봅니다. 우분투는 리눅스라고 하는 수 십 년 전 멀티 테스킹(멀티 쓰레딩)을 지원하는 운영체제 입니다.

   

필 자가 리눅스를 접했던 때는 초등학교 때였는데, 그 때는 플로피디스크 4장으로 설치를 하던 까만 바탕화면의 그런 운영체제 였습니다. 초롱불 같은 좀 허접한 사설 BBS를 날로 뚫었던, 난 "크래커야!" 라는 뿌듯한 자부심으로 사용하던 것이 바로 리눅스였습니다. 더불어 리눅스는 소스 코드가 공개가 되어 있어서 상당한 보안 취약점이 존재했습니다. 그 중에서도 vi 와 같은 것들은 해커들이 가장 좋아하던 공격 대상이었지요. 그러면서 리눅스에 X-Windows 라고 하는 GUI 그래픽 인터페이스이 탑재가 되었고, 쭉쭉 발전해서 현재와 같은 모습이 되었습니다.

   

우분투데비안 계열에서 파생된 운영체제 입니다. 또 데비안은 머꼬?? 이 데비안 리눅스는 굉장히 많은 CPU의 아키텍처를 지원하기 때문에, 서버 용도로 안성맞춤이었죠. 심지어 ARM 코어도 지원하고, 듣도 보지도 못했던 아키텍처들도 지원을 하네요.  

데비안에서 파생된 우분투는 이러 저러 잡다한 것들 다 빼고, 사용자가 친숙하게 사용하기 위한 용도로 설계가 되었고, 데스크 탑 용도로는 안성 맞춤이지요. 이 우분투는 서버와 데스크 탑 용이 별도로 존재하는데, 그 중 데스크 탑 우분투는 가장 널리 사용되는 X86과 AMD64 아키텍처를 지원합니다. 쩝.. 그러니까 여러 분이 가진 PC나 노트북에서는 다 돌아 가겠고요. ARM 코어 컴퓨터가 있으면 당장이라도 ARM 코어를 지원하는 우분투 서버 버전을 이용하시면 되겠습니다. 아무튼 쥑이는군요.

   

  

사설은 여기서 마치고, 일단 설치부터 해보아야겠지요? 우분투는 2가지 방식의 설치를 지원합니다. 매우 중요한 부분이지요.

   

첫 번째, 설치 방식은 별도 파티션을 나누지 않고도 멀티 부팅이 가능한 우비(wubi) 버전입니다. 우비는 NTFS 파일 시스템(일반적으로 윈도우에서 쓰는)을 마치 물리적인 파티션으로 인식하도록 하여, 설치를 합니다. 가령, C:\ubuntu 폴더가 하나의 파티션이 되는 것이지요. 그냥 짬짬히 쓸 생각이라면 우비 버전으로 설치하시면 되겠습니다.

두 번째, 가장 일반적인 파티션을 분할하여 설치하는 방법입니다.

   

아참… 여기서 아마 VirtualBox나 HYPER-V에 설치하려고 하는 분 계실 겁니다. 제가 정말 장담하건데 개인용 컴퓨터에서 가상화하여 설치하면 얼마 못가서 지울 겁니다. 그리고 제 성능도 안나옵니다. 영화를 아이폰으로 보는 것과 iMAX 로 보는 것과의 차이입니다. 꼭 한번쯤은 우비나 파티션을 나누어서 설치해 보세요. 후회하지 않을 겁니다.

   

   

   

   

첫 번째, 우비(wubi) 버전으로 설치해 봅시다. (구경만 해보실 분)

먼저 http://www.ubuntu.com/download 링크로 가봅시다. 아래에 우분투 데스크탑 버전으로 클릭합니다.

   

그리고 화면 스크롤은 반 쯤 내려보세요. 그럼 "Windows Installer" 설치 다운로드가 보입니다. 요거 그냥 따블 클릭해서 실행 파일을 실행하면 됩니다. 아까 얘기한대로 이것을 설치하면 가상 파티션이 생성되어 멀티 부팅이 가능합니다. 그리고 "소프트웨어 설치/제거"에서 wubi 를 삭제하시면 우분투도 금방 삭제가 됩니다. 정말 획기적입니다.

   

아래와 같이 설치할 드라이브와 적당한 가상 파티션의 크기를 지정해 주세요. 왠만하면 30GB 선택해 주시면 되겠습니다. 그리고 설치하기를 선택하시고 그 이후의 일은 여러분에게 맡기겠습니다….

   

   

   

   

두 번째, 진정한 리눅스의 성능을 느끼시려면, 파티션을 나누어 설치를 해야겠지요.

먼저 http://www.ubuntu.com/download 링크로 가서 설치하고자 하는 우분투 버전을 선택하면 됩니다. (32bit, 64bit 택일). 32bit 가 추천으로 되어있지만, 필자는 추천 항목은 안씁니다^^. 그래서 저는 64bit 버전을 선택해서 ISO 파일을 다운로드 받았답니다.

   

   

이 ISO 를 USB나 CD로 구우시면 되겠습니다만, USB로 구우실 거면 이 http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/ 링크에서 USB로 금방 구워주는 소프트웨어를 사용해 봅시다. 이 소프트웨어는 아래처럼 생긴 물건입니다.

   

그리고 설치할 파티션을 미리 확보하시기 바랍니다. 용량이 모자라시면 파티션 축소하셔서 남은 용량을 짜 내시면 됩니다. 물론 파티션은 "주 파티션"으로 만들어야겠지요?

그리고 아래의 스크린 샷을 쭉쭉 보시면서 설치하시면 됩니다. 쭉쭉 보시다가 중요한 부분에서 다시 말씀 드리겠습니다.

   

   

   

   

   

   

자 여기에서 당황하지 마시고, 아래와 같이 멀티 부팅이 가능하도록 첫 번째 항목을 유지한 채 다음으로 넘어가면 됩니다.

   

그러면 아래와 같이 칸막이 조절 막대가 있는데, 참 애매해 보이네요. 파티션 이름이나 파티션 주체에 대한 내용이 나오지 않아 혼란스럽습니다. 아래에 "고급 파티션 도구" 보이시죠? 그냥 고급 파티션 도구를 써서 설치해 봅시다.

   

설치를 시작하기 전에 파티션을 마련해 놓으라고 했는데, 여기에서 그 파티션을 선택하면 되겠군요. "주 파티션"으로 설치하면 멀티 부팅이 됩니다. 그리고 리눅스에서 즐겨 쓰는 EXT4 파일 시스템을 선택하고, 마운트 위치를 / 로 잡아줍니다.

   

여기서 잠깐 파일 시스템에 대해서 얘기하자면, 윈도우에서는 NTFS 파일 시스템을 사용하죠. 과거 FAT 파일 시스템은 최대 디스크 용량과 파일 길이에 제한이 있었고, 점점 파일들의 크기가 증가하면서 파일당 할당되는 블록이 점점 높아졌습니다. FAT16, FAT32가 대표적이죠. 쉽게 말해 MS-DOS 에서 주로 기반한 파일 시스템이었죠. FAT16 시절에는 파일명 최대 8, 확장자 최대 3… 8.3 법칙이랍니다.

이후 윈도우에서 NTFS 파일 시스템이 나왔습니다. NTFS 파일 시스템으로 암호화를 한다던가, 복구를 한다던가 하는 작업이 가능합니다.

반면, 우분투에서는 EXT 파일 시스템을 주로 사용하는데, EXT4 파일 시스템으로 포멧하시고 설치하시면 됩니다. 혹시 구형 하드 디스크인 경우 EXT2 를 선택하시면 되겠고요.

아 참… 중요한 마운트라는게 있는데, 이는 디렉토리 단위로 관리되는 디바이스라고 보시면 됩니다. 윈도우에서는 C드라이브, D드라이브로 구분이 됩니다. 하지만 리눅스에서는 마운트라고 하여 물리적인 디바이스 단위를 논리적으로 트리 형태의 디렉토리로 관리됩니다. 쉬운 예를 들면, / 는 첫 번째 하드 디스크이고요, /dev/NewDrive 는 새로 산 하드 디스크를 붙였습니다. CD-ROM 도 붙여 볼까요? /dev/cdrom 위치에 놓을 수 있습니다. 원하는 위치에 마운트 시킬 수 있다는 것이죠.

   

   

자 그럼 이제 설치합시다. 그 전에 아래의 붉은 동그라미에 설치가 되므로, 올바르게 멀티 부팅이 되기 위해서 주 파티션을 제대로 선택했는지 재차 확인 합시다.

   

   

키보드는 별탈 없으면 101/104로 선택하세요. 차후에 정신건강에 이롭습니다.

   

사용자 이름과 컴퓨터 이름은 원하는대로 입력하고 후닥 넘어가시죠.

   

   

   

   


 2012년 4월 26일, 고대하던 우분투 12 LTS 가 릴리즈 되었습니다. 우분투는 데비안 계열에서 파생된 사용자에게 친숙한 데스크탑 운영체제입니다. (더 자세한 내용은 이 링크를 참고하세요) 왜 갑자기 쌩뚱맞게 우분투 얘기가 나오는 것인가라고 의아할 수 있을 겁니다. 이유는 우분투에서 Mono를 이용하여 크로스 플랫폼을 지원하는 소프트웨어를 만들자는 것에 의미가 있습니다.

 

  

 

 

그 중, Mono는 .NET 플랫폼과 .NET Framework를 충실하게 구현한 오픈 소스이며, 크로스플랫폼을 위한 내부적인 기술 및 지원은 오히려 .NET 보다 앞섭니다. .NET의 복제품이 아닌, .NET의 확장판으로 보시기 바랍니다. .NET 플랫폼이라는 어떤 무형/유형의 구현체는 ECMA라는 비영리 표준화 기구와 ISO인 국제 표준화 기구에서 표준으로 정의되고 있습니다. 즉, Mono는 표준화 기구에서 인정한 표준을 구현한 것일 뿐이며, Microsoft 와는 어떠한 라이선스 관계도 맺지 않는 자유 소프트웨어 진영입니다.
(정확히 비표준 및 표준에 등재된 것들은 언어 스팩과 CIL 스팩입니다. 그 외적인 CLR 부분은 Mono가 크로스 플랫폼을 위해 자체적으로 구현한 레벨이 되겠지요. 전반적인 내용의 의도만 이해하시기 바랍니다.)


   

자체적으로 .NET Framework과 CLR(Common Language Runtime), CIL(Common Immutable Langauge), JIT(Just in Time) 등을 크로스 플랫폼에서 동작하도록 매우 심혈을 기울여 탄생한 독자적인 플랫폼입니다.

더불어 Mono가 혼자서 모든 것을 한 것이 아닙니다. 자유 소프트웨어 진영의 GTK(그래픽 툴 킷)을 이용하여 데스크탑 응용 프로그램을 리눅스, 윈도우, 맥, 모바일에서 돌릴 수 있습니다. 또한, ASP.NET 웹 응용 프로그램을 Apache Tomcat, FastCGI, 또 최근에 높은 성능으로 주목을 받고 있는 Nginx 와 같은 WAS(Web Application Server)에서 돌릴 수 있습니다.

 

  자 유 소프트웨어 진영의 훌륭한 운영체제와 어디에서나 돌아가는 개발 환경 및 서버 운영 환경의 크로스 플랫폼 인프라.. 그 동안 Microsoft가 제공하는 편안한 윈도우 운영체제와 IIS(Internet Information Service) 이 두 가지에 의존하며 개발하던 우물안의 개구리에서 이제는 더 큰 곳을 바라보아야 할 때인 것 같습니다. 그것을 시작하는 첫 걸음이 바로 Mono 입니다.

 

이 쯤에서 Mono 플랫폼과 그 인프라의 장점을 한번 살펴봅시다.

1. Mono 플랫폼 전체가 오픈 소스이며, 그 구현체는 매우 수준이 높고 확장 가능합니다. (.NET 플랫폼과 비교하여)

2. MonoDevelop라는 통합 개발툴(IDE)은 무료이며, 리눅스, 윈도우, 맥 등에서 설치하여 쓸 수 있습니다.

3. 운영체제 구매 비용이 없고, 웹 서버 구매 비용이 없습니다. 4. 호스팅 업체에서 우분투와 같은 리눅스(Linux) 호스팅 vs 윈도우 호스팅의 가격 = 1개월당 각각 1,000원 : 20,000원입니다. Linux는 쓸수록 금전절약입니다.

5. 가볍습니다. 운영체제 용량과 개발 환경 구성을 모두 다 해서 7.4GB 입니다.
(현 재 설치된 것들이 우분투 12 LTS, Gnome시리즈 유틸, Mono Runtime, MonoDevelop, JDK6, JDK7, OpenJDK6, OpenJDK7, Eclipse, STS(SpringSource Tool Suite), IntelliJ, NetBeans, KDevelop, Qdevelop 등등 )

6. 윈도우 기반의 .NET 응용 프로그램은 체감적으로 모든 것이 느립니다. 하지만 리눅스에서는 체감 실행 속도가 더 빠른 것 같습니다. (윈도우용 MonoDevelop보다 리눅스용 MonoDevelop 실행 속도가 나은 것 같습니다.-컴파일, 실행속도 등등)

   

 

이쯤에서 한 가지 알기 힘든 궁금증이 생깁니다. "왜 마이크로소프트는 충분히 기술력이 있음에도 크로스 플랫폼을 포기할까?". 정말 왜일까요? 언뜻 생각해보면 당연히 자사 운영체제에 특화되어야 혁신적인 기능이나 기술이 빠르게 추가될 수 있습니다. .NET Framework만 보아도 WINAPIs와 COM로 도배되어 있고, WCF만 보아도 IIS나 윈도우 서비스에서 편하게 쓸 수 있도록 하였으며, 알 수 없는 NetTcp, NetNamed, NetMsmq, MsmqIntegration 비표준 웹서비스 프로토콜을 사용하지요. 물론 이런 것들이 필요에 의해서 나오긴 했지만, 윈도우라는 족쇄에 묶어둘 수 있는 좋은 기술이기도 합니다.

   

   

그리고 오픈 소스 진영의 라이선스 정책이 마이크로소프트가 크로스 플랫폼을 지원하지 못하게 되는 장벽이 될 수도 있습니다. GPL이냐 LGPL이냐, 또는 정적 링크냐 동적 링크냐, 무료 배포이냐 상용 배포이냐에 따라 마이크로소프트의 제품의 상표권이 문제가 될 수도 있고, PDB 심볼에 원작자의 요구 문건이 포함될 수 있고, 최악의 경우에는 상용 소프트웨어의 소스 코드를 공개해야 할 수도 있을 겁니다. 물론 잘 알아보고 써야겠지만, 언젠가는 라이선스 정책은 변경이 될 수 있지요. 그런 오픈 소스 진영의 라이선스 정책 등으로 휘말리지 않는 방법이 독자 플랫폼으로만 살아가는 것일 겁니다.

하지만, 이제는 세상이 변해가고 있습니다. 초기에 아이폰의 iOS와 안드로이드 앱을 서로 다른 기술로 구현을 해야 했지만, 이제는 그런 개고생은 하지 않아도 되었습니다. C#이라는 언어만 알고 있으면, Mono for Android로 안드로이드 앱을 만들고, 이 코드를 재사용하여 MonoTouch for iOS로 아이폰 앱도 만들 수 있겠지요. 이 코드를 재사용하여 Windows Phone 앱도 만들 수 있겠죠.

   

필자는 BASIC, QBASIC, Turbo BASIC을 죽도록 해 본적이 있습니다. 그리고 Turbo C를 죽도록 해 본적이 있습니다. 그리고 Turbo Pascal을 죽도록 해 본적이 있습니다. 그리고 거의 7년 동안 .NET과 C#, ALM, Testing을 죽도록 한적이 있습니다. 그리고 최근에는 JAVA, Python, C++ COM 을 죽을 만큼은 아니고 적당히 공부하고 있습니다. 그 전에는 즐겨 사용하던 C#이라는 언어의 철학을 이해한다고 했지만, 이해하지 못했습니다. 다만, 이제서야 조금은 이해가 갑니다.

   

아주 작은 예를 들면,

왜 C# 언어의 람다식이 JAVA 언어의 람다식보다 좋은가?
왜 C# 언어의 Attribute이 JAVA 언어의 Annotation보다 좋은가?
왜 C# 언어의 익명 메소드가 JAVA 언어의 익명 메소드보다 좋은가?
왜 .NET의 보안 모델이 JAVA의 보안 모델보다 좋은가?

물론 JAVA가 더 좋은 것도 많답니다. 오해 마시길…

   

가장 큰 주제의 질문으로써, 왜 윈도우보다 크로스 플랫폼이 좋은가?

   

우 리가 사용하는 .NET 플랫폼이 생산성이 좋고, 성능이 좋고…를 우물 안에서 외치며 섣불리 판단하는 노예 아닌 노예가 되지 맙시다. 이제야 저도 느끼는 것이지만, 그런 바보 같은 사람이 되지 않기를 바랍니다. 자신의 종교만이 유일한 신이니까, 다른 종교를 무시하면 그 사람만큼 불쌍해 보이는 사람도 없습니다. 진정 과학이 발달하여 "신 같은 것은 없어!! 우리는 외계인의 후예!!" 라면… 완전 반전이죠^^; (과학적으로는 이런 얘기들의 이론이 뒷받침 되고 있습니다.)

   

현재 스스로 개발자라면 스스로에게 무언가의 질문을 던져볼 시기인 것 같습니다.

저와 함께 우분투 운영체제에 MonoDevelop을 써보느냐!! 아니면 윈도우에 Visual Studio를 쭉 쓰느냐!!

   

앞으로 총 11회의 연재를 통해 당신을 우분투와 MonoDevelop를 주무르는 멋진 개발자로 만들어 드리겠습니다.

기대해 주세요….

Visual C++ 10에서 디버깅하기

Visual C++ 10 2012. 4. 25. 00:28 Posted by 알 수 없는 사용자

예전에 Visual C++ 10과 관련된 책을 집필할 계획이 있어서 그때 작성한 글인데 책 출간 계획이 사라졌으므로(한참 전에)

그냥 공개합니다. 글은 초보자를 타겟으로 하고 있으며 Visula C++ 10의 디버깅 기능을 설명하고 있습니다.


도움이 되었으면 좋겠습니다^^



6장 디버깅.pdf


문서를 동의 없이 수정하지 않고, 출처만 남겨 주신다면 문서는 마음대로 배포하셔도 괜찮습니다^^