DLL의 간략한 소개를 하겠다. DLL의 장점으로는 아래와 같다.
1. 잘 만들어진 소스를 보관하고자 할 때
2. 컴파일 시간 낭비를 줄일 수 있다.
3. 보안 문제를 해결할 수 있다.
컴파일하면 .lib라는 확장자로 바꾸어 컴파일한다. 이런 라이브러리를 정적 라이브러리라고 한다.
DLL들어가기 전에 정적 라이브러리를 할 줄 알아야 한다.
또한 다른 회사에 자기 원본 소스를 보내주지 않고 정적 라이브러리를 만들어서 보내주면 되는것이다.
즉, .dll 파일과 .lib, .h 파일을 보내주면 된다.
헤더파일 만드는 법..
- library자체는 c로 만들어서 컴파일 해둔다.
- 헤더는 C/C++모두에서 사용할 수 있게 하는 것이 좋다.
- 모든 c++컴파일러는 __cplusplus라는 매트로가 정의 되어 있다. 가령 아래와 같이 되어있다.
#ifdef __cplusplus
#define EXTERNC extern "C"
#else
#define EXTERNC
#endif
EXTERNC int Add(int, int);
1. C/C++에서 모두 사용가능한 헤더 만들기.
2. 스태틱 라이브러리 단점
.lib는 a.exe에 전체 포함된다. b.exe라는 것에 함수를 사용한다면
문제점은 메모리에 둘다 올라와 있을텐데 두개가 다 올라와 있기때문에 메모리 낭비일것이다.
업그레이드가 매우 불편해 보인다. MS-DOS시절에 많이 쓰고 있다.
밖으로 빼는 것이 DLL이라는 파일이다. 윈도우에서는 object lib와 type lib들이 있다.
object lib - 라이브러리 자체가 기계어 코드들이 들어있다.
type lib - 함수이름.dll이름이 들어있다. 파일 크기는 작아진다.
그래서 헤더만드는 기법이 매우 중요하다.
Visual C++ 을 열고, 나는 Visual C++ 6버전을 사용하였다.
New - project - win32 dynamic ...선택후
// C파일을 생성하여 아래와 같이 add.c 를 작성한다.
#define DLL_SOURCE
#include "add.h"
int Add(int a, int b)
{
return a+b;
}
//------------------------------------------
// .H파일을 생성하여 아래와 같이 add.h 를 작성한다.
#ifdef __cplusplus
#define EXTERNC extern "C"
#else
#define EXTERNC
#endif
#ifdef DLL_SOURCE
#define DLLAPI __declspec(dllexport) // 내자신(DLL을 만드는 프로젝트)이 include하면 export
#else
#define DLLAPI __declspec(dllimport) // DLL사용자가 include 하면 import되도록 한다.
#endif
EXTERNC DLLAPI int Add(int, int);
//------------------------------------------
위와 같이 작성하였다면 컴파일한다.
그럼 Release 나 Debug 폴더에 아래와 같은 내용의 DLL과 LIB 파일이 생성될 것이다.
add.lib, add.dll
또 다른 콘솔 어플리케이션을 열고 아래와 같이 작성한다.
#include <iostream.h>
#include "add.h" //1. 헤더 include
#pragma comment(lib, "add.lib") //2. lib추가
void main()
{
cout << Add(10,2) << endl;
}
위와 같이 작성하였다면 컴파일을 해보아라. 그럼 에러가 뜰것이다. 시부렁시부렁 하면서..쭈루룩....
그럼 아래에 나와있는 순서대로 또 해본다..
이것은 라이브러리 파일과 헤더파일만 있다고 해서 되는 문제가 아니기 때문이다.
1. add.h와 add.lib만 현재 폴더로 복사해 온다
2. 컴파일, Link해본다 .exe가 생성될것이다.
3. 실행해 본다. 분명 에러가 나올것이다.
4. add.dll을 복사해 온다
5. 다시 실행해본다
즉, .h와 .lib, .dll파일 들만 복사하면 된다.
1. 잘 만들어진 소스를 보관하고자 할 때
2. 컴파일 시간 낭비를 줄일 수 있다.
3. 보안 문제를 해결할 수 있다.
컴파일하면 .lib라는 확장자로 바꾸어 컴파일한다. 이런 라이브러리를 정적 라이브러리라고 한다.
DLL들어가기 전에 정적 라이브러리를 할 줄 알아야 한다.
또한 다른 회사에 자기 원본 소스를 보내주지 않고 정적 라이브러리를 만들어서 보내주면 되는것이다.
즉, .dll 파일과 .lib, .h 파일을 보내주면 된다.
헤더파일 만드는 법..
- library자체는 c로 만들어서 컴파일 해둔다.
- 헤더는 C/C++모두에서 사용할 수 있게 하는 것이 좋다.
- 모든 c++컴파일러는 __cplusplus라는 매트로가 정의 되어 있다. 가령 아래와 같이 되어있다.
#ifdef __cplusplus
#define EXTERNC extern "C"
#else
#define EXTERNC
#endif
EXTERNC int Add(int, int);
1. C/C++에서 모두 사용가능한 헤더 만들기.
2. 스태틱 라이브러리 단점
.lib는 a.exe에 전체 포함된다. b.exe라는 것에 함수를 사용한다면
문제점은 메모리에 둘다 올라와 있을텐데 두개가 다 올라와 있기때문에 메모리 낭비일것이다.
업그레이드가 매우 불편해 보인다. MS-DOS시절에 많이 쓰고 있다.
밖으로 빼는 것이 DLL이라는 파일이다. 윈도우에서는 object lib와 type lib들이 있다.
object lib - 라이브러리 자체가 기계어 코드들이 들어있다.
type lib - 함수이름.dll이름이 들어있다. 파일 크기는 작아진다.
그래서 헤더만드는 기법이 매우 중요하다.
Visual C++ 을 열고, 나는 Visual C++ 6버전을 사용하였다.
New - project - win32 dynamic ...선택후
// C파일을 생성하여 아래와 같이 add.c 를 작성한다.
#define DLL_SOURCE
#include "add.h"
int Add(int a, int b)
{
return a+b;
}
//------------------------------------------
// .H파일을 생성하여 아래와 같이 add.h 를 작성한다.
#ifdef __cplusplus
#define EXTERNC extern "C"
#else
#define EXTERNC
#endif
#ifdef DLL_SOURCE
#define DLLAPI __declspec(dllexport) // 내자신(DLL을 만드는 프로젝트)이 include하면 export
#else
#define DLLAPI __declspec(dllimport) // DLL사용자가 include 하면 import되도록 한다.
#endif
EXTERNC DLLAPI int Add(int, int);
//------------------------------------------
위와 같이 작성하였다면 컴파일한다.
그럼 Release 나 Debug 폴더에 아래와 같은 내용의 DLL과 LIB 파일이 생성될 것이다.
add.lib, add.dll
또 다른 콘솔 어플리케이션을 열고 아래와 같이 작성한다.
#include <iostream.h>
#include "add.h" //1. 헤더 include
#pragma comment(lib, "add.lib") //2. lib추가
void main()
{
cout << Add(10,2) << endl;
}
위와 같이 작성하였다면 컴파일을 해보아라. 그럼 에러가 뜰것이다. 시부렁시부렁 하면서..쭈루룩....
그럼 아래에 나와있는 순서대로 또 해본다..
이것은 라이브러리 파일과 헤더파일만 있다고 해서 되는 문제가 아니기 때문이다.
1. add.h와 add.lib만 현재 폴더로 복사해 온다
2. 컴파일, Link해본다 .exe가 생성될것이다.
3. 실행해 본다. 분명 에러가 나올것이다.
4. add.dll을 복사해 온다
5. 다시 실행해본다
즉, .h와 .lib, .dll파일 들만 복사하면 된다.
'컴퓨터공학 기초 > C.C++' 카테고리의 다른 글
자주 사용하는 C++ STL algorithm 함수 정리 (0) | 2011.09.16 |
---|---|
[DLL] DLL 만드는 방법 2 (0) | 2011.09.08 |
cout 출력 포맷 설정하기 (0) | 2011.07.28 |
쓰레드(pthread_create, pthread_join) (0) | 2011.04.03 |
함수 포인터와 void 포인터 (0) | 2011.03.14 |