1. 라이브러리와 printf!

: 헤더파일에는 함수에 대한 선언만 들어있지 실행가능한 바이너리 코드가 들어있지는 않다.

: 해답은 라이브러리(Library) 안에 있다. 라이브러리란 여러 프로그램에서 자주 사용하는 함수와 데이터들을 실행이 가능한 바이너리 형태로 묶어놓은 파일을 의미한다.

: printf의 경우 C 런타임 라이브러리(C Run-Time Library)에 있다.

* 라이브러리 작성에 대한 동기

: 사용될 소지가 높은 함수들을 라이브러리로 구성하면 편리할 것이다.

* 라이브러리 작성

: 정적라이브러리로 프로젝트를 만들자

- 라이브러리 함수의 입력

: .h(헤더파일)과 .cpp 파일을 만들자

: .lib 파일이 만들어질 것이다.

Tip

실행파일이 생성되는 3가지 단계(전처리->컴파일->링크)에 대한 이해, 특히 링크 과정에서 하는 일이 무엇인지 확실히 이해한다.

헤더 파일 include가 지니는 의미와 헤더파일 안에 들어가는 일반적인 선언들이 무엇인지를 이해한다.

헤더파일을 정의하는 이유와 정의했을 때 얻게 되는 이점을 이해한다.


* Static Library

: 우리가 만든 라이브러리는 링커에 의해 실행파일안에 포함되게 된다.(이 과정을 링크라고 한다.) 

: 처음 만들어질 때부터 하나로 묶이게 되고 이러한 형태의 라이브러리를 가리켜 정적 라이브러리라고 한다.

* 동적라이브러리 DLL(Dynamic Linking Library) 

: 링커는 링크 과정을 통해서 실행 파일을 생성해낸다. 확장자로 .exe를 갖는 실행파일을 만들어 내기도 하지만, .dll을 지니는 라이브러리를 만들어 내기도 한다. 이것이 DLL이라고 불리는 라이브러리다.

* DLL 과 정적 라이브러리의 차이점

: 정적라이브러리와 DLL은 모두 라이브러리라는 점에서는 동일하다. 하지만, 정적 라이브러리는 정적인 특성을 가지고 DLL은 동적인 특성을 가진다. 

: 실행가능한 프로그램에서 라이브러리를 가져다 쓰는 방법에 따른 차이점이다.

- 정적 라이브러리의 특성

: 라이브러리 코드를 완전히 포함해서 .exe파일을 생성하는 형태의 정적 링크를 통하기 때문에 "실행의 독립성"을 가진다.

: 실행파일만 있으면 어디서든지 실행가능하다.

: 메모리 공간을 많이 차지하기 때문에 비효율적이다.


- DLL의 특성

: 프로세스를 여러개 실행시켰을 때 그 차이는 두드러 지게 된다.

: 메인메모리에서 페이지 단위로 DLL이 공유되기 때문에 컨텍스트 스위칭 부분에 있어서 효율이 극대화 된다.

: DLL에서 lib 파일은 링크할 떄 필요하고, dll 파일은 실행할 때 필요하다.

* DLL 제작 : 암묵적 연결

-DLL과 extern 선언

: C언어는 상관 없지만, C++은 컴파일 과정에서 Name Mangling(이름을 엉망으로 만든다는 의미) 작업을 하기 때문에 함수의 이름이 규칙에 따라 이상하게 변경되버린다.

: 이러한 작업을 막기 위해서는 .cpp, .h파일에 extern 명령어를 추가하여야 한다.

* DLL 제작 : 명시적 연결

: 소스코드 내에 DLL 연결 코드가 명시적으로 존재하는 방법이다.

: lib 파일이 필요 없다.

장점 1. : DLL이 필요한 시점에서 로딩하고, 불필요해지면 반환하기 때문에 메모리가 절약된다.

장점 2. : 프로그램 실행 중에 DLL 교체 및 선택이 가능하다.

장점 3. : 프로그램 실행 전에 로드하지 않기 때문에 실행시간을 단축시킬 수 있고, DLL 로딩에 걸리는 시간을 분산시킬 수 있다.

* 한번이상 로드될 수 있는 DLL

: 가상메모리 주소가 서로 다른 프로세스일 경우 두번 로딩되게 된다.

3. 도대체 헤더파일을 몇개나 만들 작정이야!

: 암묵적, 명시적, C 컴파일러, C++컴파일러용 으로 헤더를 만들려면 최소 3개의 헤더가 필요하다.

* 하나의 헤더파일로 모두 지원하기

: #ifdef 명령어


뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기


+ Recent posts