강좌,팁

[강좌:017] 따라하기 12. 재사용 가능한 Library(static lib, DLL) 만들기

프로그래밍을 하다보면, 일반적으로 많이 이용될 수 있는 함수들을 만들곤 합니다. 즉, 재사용이 가능한 함수들을 많이 만들게 되는데요, 함수의 소스를 잘 정리해 두었다가 필요할 때 그 소스 코드를 복사해서 이용하곤 합니다. 하지만 그것도 한계가 있죠! 매번 그런 작업을 한다는 건 귀찮은 일이고, 좀 세련되지 못해 보이지 않습니까? 그래서 우리는 라이브러리를 만들곤 합니다.

라이브러리를 만듦으로해서 재사용 가능한 함수들을 쉽게 이용할 수 있다는 장점 외에, 소스 코드를 숨겨서 배포할 수 있다는 이점도 있습니다.

여러분도 아시다시피 라이브러리에는 Static Library와 Dynamic Link Library(DLL)가 있습니다. 각각 장단점이 있을 수 있겠지만, 아무래도 DLL이 사용하기에는 편리한 것 같습니다. 이번 강좌에서는 이들 두 라이브러리를 만들어 볼 것인데요, 그냥 테스트 함수들을 만들 것이 아니라 실제적으로도 매우 유용한 함수를 라이브러리로 만들어 볼 것입니다.

제가 MP3 Player 프로그램을 만들어야할 필요가 있어서 돌아다니는 소스를 구하여 C용으로 수정 편집한 소스 파일이 있습니다. CVI정보나눔 자료실에 "[소스] Win32 API를 이용한 Audio File Play 모듈"이라는 제목으로 KD_MCI_sl_source.zip 파일을 업로드해 두었습니다. 먼저, 이 파일을 다운로드하여 이번 강좌를 따라하시기 바랍니다.

제1장에서는 Static Library를 만드는 과정을 살펴보고,
제2장에서는 DLL을 만드는 과정을 살펴보겠습니다.

특히 DLL을 만들 때, 함수와 함께 전역변수를 Export하는 것은 매우 유용하게 활용될 수 있을 거라고 생각됩니다.

제1장 Static Library 만들기

1. StaticLib 폴더를 만들어서 KD_MCI_sl_source.zip 파일을 풀어 놓기
그림 17.1에 다운로드한 압축파일과 그 포함된 파일들을 보였습니다. 이번 강좌에서는 Static Library 뿐 아니라 DLL도 만들 예정이므로 StaticLib란 폴더를 먼저 만들어서 그 안에다 압축을 해제하였습니다.

그림 17.1 다운로드 받은 KD_MCI_sl_source.zip 파일과 포함된 파일들

2. Static Library를 위한 Project 파일 생성
이제 Static Library를 만들기 위한 Project 파일을 만들어야겠군요. KD_MCI_sl.prj라는 이름으로 새 프로젝트 파일을 만들어서, 그림 17.2와 같이 파일들을 프로젝트에 포함시킵니다.

그림 17.2 Static Library를 위한 Project 파일

winmm.lib는 static library를 만드는 과정에서는 필요없습니다. 나중에 KD_MCI_sl.lib라는 static library가 생성되면, 이 라이브러리와 함께 이용되어야할 Windows의 Import library입니다. 혹시 Import Library라는 용어를 처음 접하시는 분을 위해 설명드리면요, Import library는 Windows에 기본적으로 준비된 API 함수를 이용하기 위해 프로젝트에 포함해서 Build하여야하는 Library입니다. 즉, DLL 파일은 프로그램 실행시에 Link되는 라이브러리이지만, 프로그램을 Build 할 때에는 그 DLL내 함수들의 최소한의 정보가 필요하기 때문입니다. 그 정보를 Import Library가 제공해 주는 것이지요.
왜 이 winmm.lib라는 Import Library가 필요하냐면요, KD_MCI_sl.c 파일 내에 이용된 함수 중에 바로 그 Windows Multimedia API 함수가 있기 때문입니다.

각설하고, 라이브러리를 만드는 과정을 다시 보겠습니다.

3. Project 파일 속성 설정
static library를 만드는 과정은 간단합니다. 이미 상당부분 검증이 된 소스이기 때문에 Release 모드로 변경합니다. 그림 17.3에 그 과정을 보였습니다.

그림 17.3 Release 모드로 변경

그리고, Target Type을 Static Library로 변경합니다. 그림 17.4에 그 메뉴 선택을 보였습니다.

그림 17.4 Target Type 설정

그림 17.4의 Target Type 메뉴 바로 아래에 있는 "Target Settings..." 메뉴를 선택하고 다시 "Library Generation Choices..." 버튼을 클릭하면 그림 17.5와 같은 화면이 나옵니다.

그림 17.5 Target Settings

그림 17.5에서 저는 "Generate static libraries for both compilers"라는 옵션을 선택하였는데요, 이렇게 하면 VC++과 Borland C++ 계열의 라이브러리도 함께 만들어집니다. CVI에서만 이용하려면 "Generate static library for current compatibility mode"를 선택하면 되겠죠? 그리고, OK 버튼들을 눌러서 Target Settings 대화 상자를 닫습니다.

4. Static Library 생성
이제 Project 창의 Build-Create Static Library 메뉴를 선택하여 Static Library를 생성합니다.

그림 17.6  Create Static Library

그 메뉴를 선택하여 실행하면, 그림 17.7과 같은 메시지 창이 나타나면 다 된 것입니다.

그림 17.7 Static Library가 만들어 졌다는 메시지 창

OK 버튼을 누르면 그림 17.8과 같이 static library가 만들어 진 것을 볼 수 있습니다.

그림 17.8 만들어진 Static Library

그림 17.8의 KD_MCI_sl.lib 파일은 CVI용 static 라이브러리 파일이고, MSVC와 Borland 폴더에 있는 같은 이름의 Lib 파일들은 VC++와 Borland 계열의 컴파일러(C++ Builder도 가능하리라 예상됨)에서 이용가능한 라이브러리 파일입니다. CVI는 다른 컴파일러의 라이브러리도 이용가능하기 때문에 CVI에서 msvc나 borland 폴더 내의 라이브러리 파일을 이용해도 상관은 없으리라고 봅니다.

앞에서도 말했듯이, 이 static 라이브러리를 실제 프로젝트에 이용하려면 KD_MCI_sl.h, KD_MCI_sl.lib, 그리고 winmm.lib 파일이 필요합니다.
winmm.lib 파일은 C:\Program Files\National Instruments\MeasurementStudio\CVI\sdk\lib 폴더에 있는 것과 같은 것입니다.

이리하여, Static Library를 만드는 과정을 가배얍게 통과합니다.

 

제2장 Dynamic Link Library(DLL) 만들기

5. DLL 폴더를 만들어서 KD_MCI_sl 소스 파일을 가져오기
그림 17.9에는 앞에서 이용한 파일들을 복사해 와서 파일 명을 KD_MCI.*로 변경한 화면을 보였습니다.

그림 17.9 DLL 파일 작업을 위한 파일명 변경

이제부터 이 파일들은 DLL로 만들기 위해 소스의 수정이 필요합니다.

6. DLL을 만들기 위한 Project 파일 생성
DLL을 만들기 위한 Project 파일을 만들어야겠죠? KD_MCI.prj라는 이름으로 새 프로젝트 파일을 만들어서, 그림 17.10과 같이 파일들을 프로젝트에 포함시킵니다.

그림 17.10 DLL을 위한 Project

이번에는 winmm.lib 파일도 포함시킨 점이 static library 만들 때와 다르죠?

7. KD_MCI.c 파일 수정
먼저 KD_MCI.c 파일을 수정합니다. 그림 17.11에 보인 것처럼 파일명을 표시하는 코멘트문도 수정하고, 특별히 include 문을 꼭 수정해야겠죠? 파일명이 바뀌었으니 말입니다. 그리고, Export할 변수 이름 앞과 함수 이름 앞에 DLLEXPORT라는 수식어를 넣습니다.

그림 17.11 KD_MCI.c 파일 수정 첫단계

여기서 Export한다는 것은 이 DLL을 이용하는 다른 프로그램이 해당 변수나 함수를 이용할 수 있도록 한다는 뜻입니다. KD_MCI.c 파일 내의 모든 함수명 앞에 그림 17.11의 16라인과 24라인 처럼 DLLEXPORT를 넣도록 합니다.

이제 DLL을 위한 중요한 함수를 넣어야되는데요, 커서를 그림 17.11의 15라인에다 옮겨놓고, 그림 17.12와 같이 메뉴를 선택합니다.

그림 17.12 Instruct DllMain()

그러면, DllMain()함수와 DllEntryPoint()라는 함수가 만들어지고, cvirte.h 파일이 include 됩니다. 그것을 그림 17.13과 같이 수정하여 정리하도록 합니다.

그림 17.13 KD_MCI.c 파일의 최종 정리

그림 17.13의 12라인 문장은 KD_MCI.h 파일에서 전역변수인 kmp에 대한 선언을 DLL만들 때와 DLL 사용할 때를 구분하기 위한 매크로 상수를 정의하였습니다.

이제 KD_MCI.c 파일은 수정이 끝난 것 같습니다.

8. KD_MCI.h 파일 수정
이제는 KD_MCI.h 파일을 수정합니다. 첫 라인의 파일명 정보도 수정하고, 그림 17.14에 보인 부분을 수정합니다.

그림 17.14 KD_MCI.h 파일 수정

38라인의 kmp 변수 선언은 DLL을 만들 때는 선언되지 않도록 합니다. 나중에 이 DLL을 사용하기 위한 프로그램의 프로젝트에서는 38번 라인의 선언문이 적용되어야됩니다. 그래서 위와 같이 만든 것입니다.

그리고, KD_MCI.c 파일에서와 마찬가지로 함수명 앞에 DLLEXPORT를 모두 추가하도록 합니다.

9. DLL Project 파일 속성 설정
이제는 Project 창에서 Project 속성을 다음과 같이 수정합니다.

Build-Configuration-Release를 선택하고,
Build-Target Type-Dynamic Link Library를 선택한 다음,
그림 17.15와 같이 Build-Target Settings 대화 상자에서 DLL Export Options를 설정합니다.

그림 17.15 DLL Project의 Target Settings 설정

그리고, OK 버튼들을 눌러서 대화 상자를 닫도록 합니다.

10. DLL 생성
Build-Create Release Dynamic Link Library 메뉴를 선택하여 DLL을 생성합니다. 다 만들어졌다는 메시지 창이 뜨면, 다 된 것입니다. 그림 17.16에 생성된 파일들을 보였습니다.

그림 17.16 만들어진 DLL 관련 파일들

borland와 msvc 폴더 안에는 KD_MCI.dll 파일에 대한 Borland와 VC++용의 Import Library가 만들어져 있습니다. 그리고, KD_MCI.dll 파일이 있고, CVI용의 Import Library인 KD_MCI.lib 파일이 있습니다.

다른 프로젝트에서 이 DLL을 이용하려면, KD_MCI.h, KD_MCI.dll, 그리고 KD_MCI.lib 파일이 있어야 합니다. winmm.lib 파일은 DLL을 만드는 과정 중에 이용되었기 때문에 더 이상 필요하지 않습니다.

맺는말
이렇게 하여 KD_MCI 모듈에 대한 static library와 DLL을 만드는 과정을 마치게 됩니다. 이 KD_MCI.dll 파일은 다음 강좌에서 AudioPlayer를 만들기 위해 이용될 것입니다.

이런 식으로 여러분이 자주 이용하는 함수들을 Library화 할 수 있을 것입니다.

감사합니다.
우리 하나님의 은혜가 함께 하시기를....

극동테크(www.kdtechno.com) 허창원

List of Articles
번호 제목 글쓴이 날짜 조회 수
56 [팁:6] 배포판(설치) 프로그램에 데이터 폴더 포함하기 허창원 2004-05-20 14469
55 [팁:5] Parallel Port 이용할 때, CVI Low-level support driver [2] 허창원 2004-05-18 12701
54 [팁004]팁아닌...팁..Text Message오른쪽 정렬..... [4] 야리싸내 2004-02-02 14809
53 객체의 위치값을 이용한 퍼즐 게임. file [2] 조인배 2004-01-09 13613
52 [강좌020]실행시에 uir파일을 사용하지 맙시다. file [6] 야리싸내 2003-12-19 13170
51 [강좌:019] CVI 런타임엔진과 설치 프로그램 허창원 2003-12-08 14428
50 그래프에 Zoom 기능을 만들어봤습니다.. ^^ file 야리싸내 2003-09-30 13277
49 헉..ㅠ_ㅠ;; 죄송합니다..위에 첨부파일에 소스가 없네요....ㅠ_ㅠ; file 야리싸내 2003-11-26 13238
48 [팁:003] NI DAQ 프로그래밍 예제 얻기 file 허창원 2003-08-11 14681
47 켄바스 기능을 이용한 아날로그시계 file [1] 조인배 2003-07-09 14388
46 [강좌:018] 따라하기 13. AudioPlayer(MP3, WMA, ASF, WAV 등) (2) 허창원 2003-04-11 13076
45 [강좌:018] 따라하기 13. AudioPlayer(MP3, WMA, ASF, WAV 등) (1) [1] 허창원 2003-04-11 14532
» [강좌:017] 따라하기 12. 재사용 가능한 Library(static lib, DLL) 만들기 허창원 2003-04-11 15282
43 [팁:003] 종료시 MS Office와의 충돌 피해가는 대안 [2] 허창원 2003-04-01 13406
42 [강좌:016] 따라하기 11. 데이터 뷰어3로 업그레이드하기 (2) 허창원 2003-03-19 13721
41 [강좌:016] 따라하기 11. 데이터 뷰어3로 업그레이드하기 (1) 허창원 2003-03-19 12595
40 [강좌:015] 따라하기 10. 초기설정파일(ini) 이용하기 (3) [2] 허창원 2003-02-25 13865
39 [강좌:015] 따라하기 10. 초기설정파일(ini) 이용하기 (2) [2] 허창원 2003-02-25 12390
38 [강좌:015] 따라하기 10. 초기설정파일(ini) 이용하기 (1) [2] 허창원 2003-02-25 14688
37 [강좌:014] 따라하기 9. 터치스크린에서 숫자 입력하기 (3) [4] 허창원 2003-01-15 12337