- Explicit linking -

 

순수 C언어로만 구성해보자.  참고로 개발 도구는 다음과 같다.

 

(1) 컴파일러 : Intel Compiler 10.1.020

(2) 툴 : Visual Studio 2008 Team System 2008

 

 

1. DLL 파일

 

Visual Studio -> Console Program -> empty project

 

참고로 프로젝트명은 testDll 이다.

파일명은 testDll.c 로 하고 다음과 같이 적는다.

 

__declspec(dllexport) char *str = "THE TRUTH IS OUT THERE";
__declspec(dllexport) int adds(int a, int b);

 

int adds(int a, int b)
{
 return a+b+10;
}

이렇게 소스 코드를 작성 후,  컴파일을 하자!

(순수 C언어로 컴파일 하기 위해 컴파일방법을 "C" 언어로만 하도록 바꾼다.  이는 Project->Properties->C/C++->Advanced

 Compile as 메뉴에서 "Compile as C COde" 로 하자.)

 

그러면 testDll.dll  파일이 나온다.

(참고로 컴파일시 Project->Properties->General->Configuration type  에서 Dynamic Library 로 바꿔 주어야 한다.)

 

 

2. Dll 를 사용하는 소스

 

Visual Studio -> Console Program -> empty project

 

프로젝트명은 "test" 로 한다.

 

(여기서 주의점은 LoadLibrary 시 UNICODE 로 된 dll 파일명을 넘겨야 컴파일시 에러가 발생하지 않는데, 이를 위해서

 _T() 매크로를 사용해서 넘겨야 한다.  문젠 이 _T 매크로를 사용하기 위해선 MFC 를 사용해야 한다. 

 따라서 이 예제에서는 어쩔 수 없이 순수 C가 아닌 C++ 로 컴파일을 대체해야 한다.

 

 만약, 본인이 순수 C 를 이용해 _T() 매크로를  대체 할 수  있는 코드를 만들어서 테스트 해본 후 성공한다면 업데이트 할 것이다.)

 

 

test.cpp 파일을 등록하고 아래와 같이 코딩한다.

 

(주의 사항 : !! MFC 를 위해 <afx.h> 및 <afxwin.h> 를 사용할 텐데, 이는 반드시 <windows.h> 보다 위에 와야 한다.)

 

#include <afx.h>
#include <afxwin.h>
#include <stdio.h>

#include <windows.h>

int main(void)
{

//function pointer

int (*adds)(int, int);


 // DLL Load
 HMODULE  hInst;
 hInst = LoadLibrary(_T("testDll.dll"));
 if(hInst==NULL) {

  printf("failuressss \n");
  return EXIT_FAILURE;

 }

 adds = (int (*)(int, int))GetProcAddress(hInst, "adds");
 printf("sum %d \n",adds(4,6));
 FreeLibrary(hInst);

 

 

  return EXIT_SUCCESS;
}

컴파일을 한 후 생성되는 실행파일과 같은 디렉토리에 1번에서 만든 testDll.dll 파일을 함께 놓고 실행하면 결과가 나올 것이다.



[출처 : http://blog.daum.net/artofprogramming/4526612]

+ Recent posts