지금은 프로그래밍을 잘하는 ... 에게 보냈던

 

 

누구든 어렵게 느껴지는 부분이 있는 것 같다.

최근 포항공대 이승용 교수님 강의를 들으면서 느낀점은

확실히 많이 아는 사람이 쉽게 가르친다는 것이다.

----------------------------

진도를 못 따라가는 xx 에게...

네가 얼마 전 비트 초급 교육을 받으면서 진도가 어려워 포기했고 따로 공부한다고 했을 때 많이
아쉬웠었어. 물론, 네 뜻대로 빨리 가는 것보다 하나하나 짚고 가고 싶고. IT 전공자가 아니라 안개속을
걷는 것 같은 기분일 것은 나도 잘 알거든. 누군 태어날 때부터 프로그래머가 있니? 또 공황장애가
있다고 하니 글로 주는게 앞으로 너에게도 좋을 것 같아서 이렇게 쓰기로 결정 했다. 지난 5년간 대학생
멘토링 하면서 느꼈던 것이지만 너희들도 선/후배들이 많으니 이미 아는 것들 것 많을거라고 생각했어.
그러나 내가 안다고 생각하는 순간 더 배울 자세를 잃어버리기에 너에 대한 이야기를 더 듣고 싶었지.
주변에 금융쪽으로 간 친구들이 있어서 초봉이 5000이 넘고 해도 IT 업계에서 개처럼 산다는 것을
본다는 말과. 창업해서 엑싯(exit)만 하고 살아도 좋겠지만. 일은 일이고 IT 업계에서 칼퇴해서 자기
삶을 살고 싶다고 말할 때 이과 field(삼성전자 무선 사업부 6년)에서는 그러지 못하고 문과 field(본사
staff 1년) 에서는 그럴 수 있었던 기억을 떠올리며, 네가 오아시스처럼 느껴지기도 하더라. 그러나 이미
16년 전 내가 대학교 막 들어갔을 때에도 후배들이 한국 IT는 썩었다면서 일본을 준비하고 또 일본으로
취업한 것을 떠올려보면 이미 4학년인 너도 알만큼 안다고 생각해.

그러나 나도 개발을 2번 떠나서 취미로 하다가 다시 돌아올 수 있었던 것은 재미가 있어서야. 뭔가를
만들 때 드는 기분은 정말 좋거든. 미쳐서 성공하던지 논리적으로 망하던지 두가지 선택권이 있다고
생각해. SI라고 해서 System Integration 시장이 3조 가까이 돼. 그리고 기본 지식도 필요 없고. 그래서
너도 이것을 하게 된거고. 전공자들 학교 커리큘럼들도 거의 SI 인력 양성에 맞춰져 있어. AR, VR, 비트
코인이나 이더리얼등을 어떻게 따라갈지 걱정이긴 해. 그러나 주입식 교육 덕택에 한국이 수학은
잘하잖니. 그 덕분에 뒤늦게 배웠지만 열정을 불태운 사람들에게 독일이나 중국 일본등 국가 차원에서
한국에 러브콜을 보내는 정보를 저번주 아는 기자에게 받았어. 외국에 나가는 것만 희망이 된 이유를
알고 있지만 말하자면 너무 길어서 나중에 조금씩 말해 줄께.

우선 네가 가장 먼저 알아야 할 것은 추상화야. 내가 추상화 관련해서 쓴 글이 있어서 그대로 붙여넣어
볼께.

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
전공자 멘토링을 하다 보니 [추상화] 관련 헷갈리는 학생이 있습니다. 확실하게 개념을
잡아 주세요. 추상화는 抽象化, 뽑을 추, 꼴 또는 모양 상, 되게 할 화.입니다. 어떤
것에서 뽑아내는 방법을 말합니다.

진짜 추상화입니다. 추상화가 잘되었습니다. 누가 봐도 사람이지요. 사실적 표현
양식과는 다르게 작가의 눈에 비친 인간의 내면 모습까지도 표현해 냈습니다.

발전설비, 전기 설비, 집으로 오기까지 변압 과정들, 전등과의 배선에 대해서 전체를
모르더라도 스위치를 ON 하면 불을 켜고 OFF 하면 불을 끈다는 것을 알고 있습니다.
첫 번째 추상화와 두 번째 스위치. 모두 추상화 과정을 거쳐서 나온 결과물입니다.

이것을 API라고 합니다.

CBD, 모듈, 프레임웍, SOA, EAI, PaaS, SaaS, DBaaS, IaaS  등도 추상화 과정을
거쳐 나온 API의 일종입니다. System.out.println('HELLO WORLD"): 을 쓸 때 화면에
점을 찍는 방법 ASCII CODE나
UNICODE, JVM 프레임웍을 거쳐 RAM에 저장된 내용이 CPU를 거치고 메인보드의
노스브릿지를 거쳐 그래픽 카드로 가고 GPU에서 여러 처리 과정을 거친 뒤 D-Sub,
DVI, 혹은 HDMI 등을 거쳐 모니터로 표현되고 모니터에 H라는 글자를 찍을 때 점의
위치 조합과 색 표현 방법, 주사 방식, 주파수 등 다 몰라도 됩니다. System.out.print 가
화면에 찍는 API라는 것만 알면 되지요. 이것을 추상화된 API라고 부릅니다.

또 간단히 API라고 부릅니다.

[추상화]와 [API] 우선 이렇게 짚고 이해를 하기 시작하면 많은 용어들에 대한 안개가
걷히게 됩니다. 깊게 들어가다보면 여러 해석들이 나눠지지만 뿌리는 이렇습니다.

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

장황하게 설명했지만 간단하게 말하면 구체화의 반대말이 추상화고, 추상화는 내부 구현을 몰라도 쓸
수 있게 만드는 방식을 말해. API는 그렇게 나온 결과물이야. 사실, 세부적으로 설명했던 노스브릿지,
그래픽 카드 등의 내용들은 세부적으로 찾아보면 더 세밀하게 나눠질거야.

IT에는 분야가 정말 많아. 다 시장의 요구 때문에 만들어 진 것이고.
전문화가 필요하다보니
내과의사, 외과의사, 소아과의사 처럼 분야가 나누어 지게 되었어.

그 중에 데이터 구조와 알고리즘, 운영체제 이론은 기본이라고들 해. 이 둘을 공부하다 보면 아마 결국

수학이라는 학문에 봉착할테고 더 공부하려면 개발자가 되어 만들기 보다는 학교로 돌아가서 더
공부하고 논문을 쓰는 쪽으로 가게 되어 있어.
딱 잘라 말하면, CREATOR는 아니야. 페이스북의 주커버그도 이제 바쁘고 너무 잘하는 사람들이
많아서 경영에 집중할거라 생각되. 걔는 Top coder에서 등급이 좋지 않았다고 이미 알려져 있지만 어떤
코드던 사람들의 이목을 이끌었지?

그게 RUN & FIX 방법이야. 일단 만들고 실행해 보는거지. 보통 초급단계에서는 RUN & FIX를 하고
중급 단계로 가면 TDD라고 테스트 주도 개발을 하게 되어 있어. 1인 개발자라면 자기 손에서 제품이
완성되어 끝나기 때문에 RUN&FIX가 맞지만. 일반적 기업에 가면 완결된 제품을 만들기 보다
아키텍트가 만든 전체 설계에서 특정 부분을 담당하고 모듈을 만들게 되거든. 해당 모듈은 다른 부분과
연결돼. 내가 모듈로서 해야 할 일은 return 값을 주거나 파라미터로 넘어온 값을 변경시켜 주는 거야.
Int blahblah(int parm) { return someIntvalue ; } 이런 식이지. 모든 언어가 똑같아. C던 자바던 C++이던
C#이던 최근 나온 SWIFT 던. 리턴이 없으면 void라고 해. 즉, 이런 리턴값을 테스트하는
테스트케이스를 먼저 만드는 것을 테스트 주도 개발이라고 해. jUnit은 그것을 하기 위한 툴이야.
하지만 중급에서 고급으로 넘어가면 다시 Run&Fix를 하게 되어 있어. 그 이유는 곡브 프로그래머는
대부분 하드웨어까지 고려한 커다란 모듈 개발을 하거나 설계를 하게 되는데 모든 모듈의 테스트
케이스가 작성되어 있다고 해도 모듈 끼리 연결된 부분의 테스트 케이스는 작성하기가 까다롭고
만드는데 오래 걸리고 또 그렇게 만들었다고 해도 100% 확신하지 못해. 코드 레벨에서 테스트하는
것을 화이트박스 테스팅이라 하고 RUN&FIX로 테스트 하는 것을 블랙 박스 테스팅이라고 해.
운영체제까지 포함된 프로젝트는 전부 RUN&FIX라고 보면 되. 안드로이드 폰 만들 때에도 수억을 받는
사람들로 구성된 수많은 부서들이 테스트 케이스를 작성해서 개발자에게 줬지만, 사실 그 정도 지식이
있으면 개발을 해야 하는데 실제 제품 개발하는 사람들이 지식 수준이 더 높으니까 제대로된 테스트
케이스가 될 수 없었지. 결국엔 다 RUN&FIX로 가는 거야. 워낙 개발하는 사람들이 많으니까
RUN&FIX를 빨리 하기 위해서 Jenkins라는 지속 통합 툴을 써. 사실 지속통합하고 빠른 피드백을 주는
것 자체가 애자일 개발 방법이라고 보면돼. 설계 전체 다 하고 개발하는 방식은 요즘 점점
쇠퇴해져가고 있어. 왜냐면 속도가 잘 안나거든. 그러나 프로젝트 규모에 따라 전체를 설계하고
개발해서 한방에 컴파일 하는 것이 waterfall 방식이야. bigbang이라고도 하지. 사실 나도 개발
방법론만 해도 많은 강의를 들었지만 실무에서 그렇게 되는 것은 단한번도 못봤어. 그렇게 이론
주장하던 사람들이 결국에는 개발을 못하는 것을 사람들이 깨달았기 떄문이야. 그래서 가르침 없는
push가 시작되고 그들의 자리를 지키기 위한 정치가 시작되는 거지.

자 그럼, RUN&FIX라고 하면 좀 싸보니까 애자일 방식을 채택하고 블랙박스 테스팅을 주로 하는
개발을 살펴보자. 프로젝트가 커지면 블랙박스 테스팅도 매번 못해. 개발시간 보다 테스트 시간이 더
걸리게 되거든. 그래서 릴리즈를 해서 버전을 fix해. 블랙박스 테스팅의 포인트는 FIX된 버전에서는
전에 릴리즈된 버전에 비해서 기능이 더 추가되던지 버그가 줄던지 해야해. 하드웨어 변경 사항이
있었다면 기능이 안 들어가고 버그가 늘어나도 어쩔 수 없으니까 일단 버전을 픽스 해서 문제점들을
뽑아 그걸 bug report 라고 하고 bug report를 관리하는 툴들이 많이 있어 JIRA나 레드마인이 그걸 해
주는 툴이지 최근에는 bitbucket이나 github에도 이슈(버그)관리를 해줘. bitbucket이나 github은 버전
관리 툴이야. 둘이서 작업할 때 한 사람이 작업하다가 저장하고 다른 사람이 수정도 안했는데 덮어써
버리면 수정 내용이 날아가 버리지? 그래서 모든 변경 사항을 저장하는 것이 버전 관리 시스템이야.
CVS, SVN, TFS, GIT 이 그 중하나고 GIT 리눅스 커널 개발로 HOT하게 되서 사람들이 많이 쓰니까
관련 사이가 나온게 github이랑 bitbucket이지. 특히 github은 일전에 sourceforge가 가지고 있던 소스
메카의 역할을 가져갔어.

이정도 히스토리를 알면 개발 준비는 끝난거야. 블랙박스 테스팅 & 지속 통합 & github

이제 추가적으로 더 알아야 할 것은 추상화된 것들 반대로 구체화 해서 내려가야 하는 점이야. 우선
C와 C++은 같다고 해 둘께. 사실 같지는 않아. 그러나 C++을 창시한 사람이 처음 한게 C로 번역되는
번역기를 만들었어. 그래서 C/C++로 혼용해서 쓰여. C/C++은 니가 잘 아는 애플의 맥에서 쓰이는
LLVM, 자바의 핵심인 JVM, 그리고 다른 대부분의 언어들을 만들었어. 즉, C/C++은 다른 언어들의
아버지고 그 자식들은 부모에게서 상속받은 애들이지. 결국 모든 언어가 하나로 통한다는 거야.
이론적으로는 이렇게 간단하지만 개발을 하려면 세부 내용을 알아야 겠지?

우선 Visual Studio 2015 Community 버전을 설치 해줘. 윈도우를 선택하는 것과 Visual Studio를
선택하는 이유는 운영체제가 Microsoft에서 나왔기 때문이야 즉, 추상화된 API를 만드는 회사에서 그
것을 다루는 툴을 냈기 때문이지. 그러나 만드는 실력은 회사마다 달라서 다른 실력있는 회사가 시장
장악을 못하도록 무료로 푼 버전이 있어. 뒤에 express나 community가 붙으면 무료라고 생각하면 되.

자바를 배우고 있는데 왜 쌩뚱맞게 Visual Studio 냐고? 자바도 할거야. JDK8 랑 Eclipse mars2 도
준비해 줘.. 결국 언어는 다 똑같다는 걸. 결국 추상화된 것을 이용할 수 있게 해 주는 것 뿐이야. 그러나
혼자 개발하는데는 한계가 있어. 그래서 여러 사람이 개발하기로 했고. 서로 대화를 하기 위해
최소한의 데이터 구조, 알고리즘, 운영체제 이론을 공부하기로 했지. 또 자주 사용하는 코드들을
정형화 해서 패턴이라는 것도 말들었어. 이보영의 패턴 잉글리쉬도 똑 같은 개념이야.

아마나 요리사가 될 수 있지만 누구나 맛있는 요리를 만들기는 힘들지? 또 한부분만 알아서는 제대로
만들 수 없어. 그래서 기본적으로 프레임웍으로 나뉘어져. 윈도우 개발자, 안드로이드 개발자, 아이폰
개발자 등. 하나의 프레임웍에 특화된 개발자로 성장하지. 자주 쓰는 API, 프레임웍에서 허락한 API
들을 알고 또 구현 방법을 알고 있지. 초급에서 중급으로 가려면 프레임웍 정도는 만들 줄 알아야해.
그것을 만드는 방법은 그리 어렵지 않아. 프레임웍 이라는 것은 다른 것들이 개발될 수 있도록 쓸 수
있는 API를 만들면 되. 또 그들이 서로 소통할 수 있도록 메시지 큐 구조를 집어 넣으면 되. 말은 쉽지만
관련 코드를 짠다면 어마어마 할거야. 그러나 그것도 가르쳐 주려고 해 .지금은 그 단계까지 배우기
위한 기초야.

Visual Studio 2015 Community를 설치했으면 실행해봐. 에디터가 나오지 그게 IDE(통합개발툴)이라는
거야. 그런데 지금 그걸 사용하지는 않을거야 창을 닫고 탐색기를 열어서 어디에 설치 되었는지
찾아봐. 못 찾겠으면 윈도우키 +R 을 누르고 regedit를 쳐서
HKEY_CURRENT_USER
SOFTWARE
  Microsoft
VisualStudio
14.0_Config

를 차례로 따라가면

InstallDir

이 보일거야

나의 경우에는
F:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\

가 경로에

거기에서 devenv.exe 를 치면 IDE가 실행되는 거야.

Devenv.exe는 IDE 파일일 뿐이고 네가 윈도우 프로그램을 만든다고 하면 소스 파일
(*.c, *.cpp)를 컴파일 해서 오브젝트 파일(*.obj)로 만들고 실행파일(*.exe)로
만들어야해. 그것을 실행하면 윈도우에서 프로세스가 되거든. 현재 실행되고 있는
프로세스를 RUNNING PROCESS라고 해. Ctrl+Shift+ESC를 눌러서 나오는
프로세스들을 종료하면 프로그램도 같이 종료되어 버려. 우리는 많은 프로그램들을
동시에 실행시키지? 실제로 운영체제는 동시에 프로세스를 실행시키는 것이 아니라
짧게 짧게 한번씩 실행시켜줘. 그런데 그 스위칭이 너무도 빨라서 마치 동시에 실행되는
것처럼 보여. 이것은 컨텍스트 스위칭이라고 하고. 이것을 수행하는 주체는 커널이야.
정확히 말하면 커널의 스케쥴러가 그 일을 담당해. 커널에 접근하려면 커널 영역으로
들어가야 해. 크게 보면 커널 영역과 유저 영역이 있는데 커널 영역에 근접한 프로그램
중 하나가 디바이스 드라이버 라고 보면 되. 점점 하부단 API를 쓸 수 록 고급
프로그래머의 느낌이 있지? 실상은 달라 일정 수준 프레임웍을 파악하기까지가 힘들지
개발을 해보면 무한 RUN&FIX야. 로고나 디버깅을 위해 잠시 멈출 수 있는 BREAK
POINT를 잡을 수 있다면 모르겠지만 하부단 프로그래밍 하다보면 아예 알 수 없는
부분이 있어. 칩간의 커뮤니케이션인 IPC도 그 중 하나인데 이런건 RUN&FIX나
블랙박스 테스팅으로 개발하기가 힘들어. 칩단 디버깅 툴 중에 시중가 1000만원.
대량으로 사면 600만원 하는 TRACE32가 있어. 그런데 이것도 브레이크 포인터를 루프
안에서 걸다보면 계속 죽어서 삽질의 연속이야 ㅠㅠ

자 우리는 거기까지 가지는 않을거야. 하지만 해봐야하는 것은 맞아. 그래서 프레임웍을
이해하고 앱을 더 잘 만들 수 있어. 일례로 안드로이드 프레임웍은 앱이 죽어도
프레임웍이 잘 캣치해서 운영체제는 죽지 않는 것으로 알잖아? 아니. Notification bar를
계속 띄우다보면 폰이 아예 죽어. 윈도우도 블루스크린 뜨잖아? 결국 하부단을
이해하고 잘 자야 한다는 것이지. 그래서 IDE 말로 command상으로 개발하는 거야.

우선 헬로우 월드를 띄워보자.

#include <iostream>
int main() {
printf("hello world");
return 1;
}

이게 소스야. 윈도우 + R 눌러서 층 치면 까만창이 나오지?

거기서 copy con a.c 를 치고 저 코드를 친 다음 Ctrl+Z를 눌러봐
그럼, 파일이 하나 생겨. 그냥 에디터로 만들어도 되긴해 
자 그럼 실행하려면 컴파일-링크 과정을 거쳐야 한다고 했지? 컴파일 하려면 cl.exe /c ,
링크하려면 link.exe가 필요한데 cl.exe 만 실행시켜주면 자동으로 컴파일이랑 링크
과정을 거쳐

cl.exe a.c 라고 해보자.

에러가 뜰거야.

{에러화면}

cl.exe를 찾을 수 없어서 뜨는 거거든.
윈도우 환경 변수 세팅을 하고 다시 윈도우키 +R을 눌러서 커맨드 창을 띄워야해.

고급 시스템 설정에 들어가서 path 설정을 해 줘야 해. path라는 것은 현재 내가 있는
디렉토리가 아니더라도 다른 디렉토리의 파일을 실행할 수 있도록 해 주는 거야.

환경변수로 가서

시스템 변수에 Visual Studio의 cl.exe가 있는 디렉토리를 찾아서 넣어줘
F:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
나는 경로가 이렇네. Cl.exe 를 찾을 때는…

이렇게 탐색기 검색으로 찾아 주면 된다네.
난 JUNHO라는 변수는 만들어서 거기다가 넣어 줬어. 실재로는 PATH라는 변수에
넣어줘야해.

여기다가 말이지.

그런데 저렇게 변수를 선언하고 나면 윈도우에서는 %변수명% 으로 쓸 수 있어.

이렇게 추가해 주면 돼.
cl.exe가 많은 이유는

이렇게 폴더가 많기 때문이야. 각 폴더마다 cl.exe가 있지? X86은 우리가 쓰는 인텔
CPU를 말해. X64는 64비트 지원 인텔 CPU고 ARM은 대부분의 모바일 기기가 쓰는
CPU야. 즉, CPU 마다 컴파일러가 다르다고 볼 수 있어. 왜냐면 CPU도 API를 가지고
있거든. CPU마다 API가 다르다는 거야. 개발하는 PC랑 해당 CPU에 맞는 컴파일러를
그냥 컴파일러라고 하고 개발 하는 PC랑 CPU 구조가 다른 것을 지원하기 위한 것을
크로스 컴파일러라고 해 . 요즘 아이들은 IDE가 워낙 잘 되어 있어서 이런 것을
모르더라. 추상화된 것만 쓰면 된다고 생각하겠지만 에러가 났을 때 하부 구조를 모르면
디버깅을 할 수 없어. 참, 버그 없는 소프트웨어는 없단다.
(중간 스킵) 환경 변수를 설정하고나서 커맨드 창을 다시 실행하면 이제 cl.exe 를
실행할 수 있어.

어라 그런데 또 에러가 나네? No include path set 이라고 떠.
Include 라는 환경 변수가 없어서 그래. 이제 커맨드 창에서 환경변수 세팅하는 법을
가르쳐 줄게. 왜 진작 안 가르쳐 줬냐고? 커맨드 창에서 환경변수 세팅하면 창 닫았을
때 내용이 날아가버려서 그래.

Iostream은 cpp에서 쓰는 거거든. 커맨드 창에서 move a.c a.cpp로 바꿔볼래? 그리고
cl.exe a.cpp 라고 해보자.

또 에러가 뜰 거야.

컴파일 과정에서는 헤더 파일들이 필요해 헤더 파일은 앞으로 쓸 라이브러리들의
형태가 저장된 거야. 라이브러리는 링크 과정에서 합쳐지는 거고. 다른 누군가가 만들어
놓은 모듈이라고 보면 돼.

Iostream 을 찾아서 경로를 복사해둬.

우리가 찾는 대부분의 파일들은 아래 두 폴더에서 찾으면 되. (컴퓨터 마다 패키지 마다 조금씩 달라)
F:\Program Files (x86)\Microsoft Visual Studio 14.0
C:\Program Files (x86)\Windows Kits

이렇게 찾았으면 찾을 폴더를

set INCLUDE=F:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\
이렇게 넣어주면 되. 띄워쓰기 유의해야 돼. 잘들어 갔는지 확인하려면
Echo %INCLUDE% 쳐보면 되.

이런방법으로 에러 날 때 마다 해당 파일을 경로를 찾아 넣어주면 되는데
추가 할 때는
Set INCLUDE=블라블라;%INCLUDE%

이렇게 해주는 거야. 세미콜론(;) 과 %INCLUDE%을 붙여 주면 이전 경로가 다시 들어가

echo %INCLUDE%
C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\ucrt;F:\Program Files (x86)\Microsoft
Visual Studio 14.0\VC\include\
이렇게 나오면 아마 대부분 해결이 되었을 거야.

LINK : fatal error LNK1104: cannot open file 'libcpmt.lib'

이제 링크에러가 나지? 이건 앞에서 말했듯이 cl.exe 가 link까지 수행해서야 컴파일만 해보자.

경고는 있지만 컴파일이 완료되고 a.obj가 생겼을 거야. Object 파일은 메모리 allocation이 되지
않은 중간 단계의 파일인데 이게 곧 라이브러리 파일이라는 거야. 이 단계까지 만들고 파는
경우도 있어. 그럼 내부 구현은 보이지 않고 팔 때는 헤더만 제공을 하는 거야. INCLUDE 파일들
열어보면 본체는 없지? (꼭 열어 보길)

Math.h 헤더 파일만 봐도 저렇게 함수 형태만 나왔있어. 컴파일 할 때 봤겠지만 컴파일 할때는
헤더만 있으면 되거든? 링크할 때 본체(obj, lib)가 필요해. 그래서 이것도 모듈의 일종이고 팔 수
있는 거지. 역공학이 발달해서 이제 obj도 소스도 다시 만들어 주기도 해. Exe도 분석 가능하고
말이야. 그래서 패킹이란 것도 해. 패킹은 엔트리 포인트(소스의 시작점)를 찾지 못하게 해서
코드를 난독화 시켜 버리지. 윈도우에서 exe 파일 PE 파일 포멧이라고 해 리눅스에서는 ELF 고
맥에서는 HFS라고 해 정형화 되어 있으니 운영체제가 읽어서 프로세스로 만들어. 그래서
프로세스도 다시 exe로 만들수 있단다.

자 우선 이런 것들을 다 해결하고 나면

링크에러가 떠. 링크 에러를 해결하려면 LIB 환경변수 세팅을 해 줘야해. Libcpmt.lib가 없다고
했으니 찾아서 넣어주고 이렇게 하나하나 해결하다 보면

Set LIB=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10586.0\ucrt\x86;C:\Program Files
(x86)\Microsoft SDKs\Windows\v7.1A\Lib\x86;F:\Program Files (x86)\Microsoft Visual Studio
14.0\VC\lib;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10586.0\um\x86
로 해결이 될거야. 나랑 폴더 위치는 다를 테니 다 찾아서 넣어줘.

그럼 이렇게 링크도 되고. 최종적으로 a.exe가 나와서 a.exe 를 실행시키면 hello world가 나와.
리눅스나 맥에서 gcc로 컴파일 하면 a.out 이 나오고 ./a.out하면 똑 같은 결과가 나올거야. 물론,
path 나 헤더, 라이브러리는 /I , /L , -I , -L 로 다르긴 해.

자 이렇게 Hello world 하나 찍으면 전반적인 사항들을 알게 되었을 거야.

다음에는 obj 끼리 연결시키는 방법 lib 를 만든느 방법을 알아보자.

'Blog History' 카테고리의 다른 글

264  (0) 2020.05.15
263  (0) 2020.05.15
261  (0) 2020.05.15
260  (0) 2020.05.15
259  (0) 2020.05.15

+ Recent posts