컴파일(compile) : 소스코드를 컴퓨터가 이해할 수 있는 언어(native code (machine language = 기계어))로 번역해주는 것
[ 컴파일의 3단계 ]
* lexical-phase - 어휘 분석 : 괄호, semicolon이 빠졌다는 등의 error 검출
* syntactic-phase - 구문 분석 : 함수의 parameter 등의 error 검출
* semantic-phase - 의미 분석 : ex) long a, *b;
a = b; // syntax는 맞지만 의미상의 오류
빌드(build) : 컴파일된 소스코드에 필요한 file을 링크(link)시켜주는 것
--------------------------------------------------------------------------------------------------------------------
소스코드의 compile 과정이 진행되고 난 뒤엔 vc++ 이라면 .obj가 생성됨으로써 compile 과정은 끝나지만 이것은 실행 file이 아니라서 실행할 수가 없다.
.exe나 .dll 같은 것을 만들기 위해서는 build, 즉 link가 필요하다.
#include < stdio.h >
void main()
{
printf( "%d\n", 1 );
}
라는 source를 만들었다면, printf는 stdio.h에 선언되어 있으므로 compile은 잘 된다.
하지만, printf의 몸체는 include된 stdio.h에도 이 source file에도 없다.
즉, 실행할 부분이 없다는 것이다.
.lib라는 file이 바로 '이런 function 같은 것들이 어느 file에 있다'라고 알려주는 역할을 하는데
(이미 알고 있다면 .lib 없이도 명시적으로 link할 수 있다.)
이런 정보를 이용해서 link를 하는 것이다.
link를 하면서 같은 file (exe나 dll등의 최종 목적 file)에 묶이게 되는 것을 static link library 라고 하고, binary는 따로 있는 것을 dynamic link library 라고 한다.
* .dll(Dynamic Link Library) ??
- 어플리케이션에서 동적으로 링크하여 사용할 수 있는 라이브러리.
(dll에는 code 혹은 resource가 있어서 그것을 필요로 할 때 사용할 수 있다.)
printf는 c runtime library 어디에나 다 있기 때문에 아무거나 link해도 다 될 것이다. (libc, libcmt, msvcrt)
#include < windows.h >
void main()
{
MessageBox( NULL, "text","caption", MB_OK );
}
라는 source를 compile하고 link하면, user32.dll에 있는 MessageBoxA를 쓰게 된다.( MessageBox가 아닌 MessageBoxA!! )
그 이유는 source의 MessageBox에 커서를 놓고 F12를 눌러보면 알 수 있다.
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif // !UNICODE
compile time 에 MessageBox를 MessageBoxA로 바꾸고 나중에 link할 때도 user32.lib에 있는 정보를 읽고 user32.dll과 연결시켜 주는 것이다. (물론 unicode로 build 한다면 MessageBoxW를 사용한다.)
* visual studio 6.0 tool인가에 보면 dependency viewer라는 것이 있는데, 위의 source로 build된 exe를 보시면 user32.dll의 MessageBoxA를 쓴다는 걸 쉽게 알 수 있는 유용한 Tool이다.
바이너리 코드라 하면 실행파일을 말하는것 같기도 하다 ~
'Stupid Computer > 2. C 언어' 카테고리의 다른 글
[C/C++] #ifdef 사용법 ! ifdef, endif 사용법 !! 모드 전환 ! (0) | 2014.05.08 |
---|---|
[C/C++] Menu 화면 구성 ! if else if ~ ( 메뉴 10개 이상 넘어갈때 ) (0) | 2014.04.24 |
[C/C++] switch case문 10개 이상 만들기 ! (0) | 2014.03.24 |
[json/cjson] json_object_is_type 사용법 (0) | 2014.03.06 |
[C/C++/리눅스/자바] Json 사용법 및 사용예제 (0) | 2014.02.28 |
[링크에러 LNK2019] C++에서 C 함수 사용하기 (0) | 2014.02.26 |
main(int argc, char* argv) 컴파일 옵션 사용 하는 예제 (0) | 2014.02.24 |
윈7에서 비쥬얼 스튜디오 환경변수 설정!!(변수추가) (0) | 2013.06.30 |
[C++] 소셜네트워크서비스 ! SNS 코딩하기, 코딩 프로젝트 예제 ! (3) | 2013.05.29 |
C++ Class개념과 생성자 ! (예제) (0) | 2013.05.18 |