본문 바로가기

Stupid Computer/2. C 언어

[C/C++] 기본! 컴파일과 빌드~ 차이점

컴파일(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이다.


바이너리 코드라 하면 실행파일을 말하는것 같기도 하다 ~