반응형

C에서 간단한 dll을 만들어 C++에서 사용하기


 C에서는 MVC++의 C++와 달리 "#pragma" 매크로를 지원하지 않는다. 하지만, C에서는 전통적으로 다른 파일에서 사용할 수 있도록 하는 "extern"을 키워드가 있다.


 다음은 MSDN의 간단한 예시를 조금 수정했다. 


내보내기 예시)

 MSDN의 예제의 경우 __declspec( dllexport )로 작성된 부분이 __declspec( dllimport )로 작성이 되어 있는데, MSDN측 오타로 생각된다.

// MyCFuncs.h
#ifdef __cplusplus
extern "C" {  // only need to export C interface if
                  // used by C++ source code
#endif

__declspec( dllexport ) void Hello(void);

#ifdef __cplusplus
}
#endif


// MyCFuncs.c
#include "MyCFuncs.h"
#include <stdio.h>

void Hello(void)
{
    puts("Hello world");
}


dll 들여오기(Import) 공통 작업

 C++의 dll 파일을 링크하는 것과 비슷한 준비 작업이 필요하다. 실행 프로그램의 프로젝트를 생성한다. 여기서는 "Windows 데스크탑"의 빈프로젝트로 생성한다.

해당 프로젝트 폴더로 내보내는 예시에서 만든 lib파일과 헤더파일을 복사한다.

"솔루션 탐색기"에서 "헤더 파일"항목에 마우스 우클릭을 한뒤 "추가 -> 기존항목"에서 복사한 헤더파일을 추가한다.



들여오기 예시1)

 "솔루션 탐색기"에서 해당 프로젝트 명을 우클릭하여 "프로젝트 속성" 창을 연다.

프로젝트 속성의 "링크 -> 일반"의 "추가 라이브러리 디렉터리" 항목에 lib 파일이 있는 폴더 경로를 추가 입력해준다.

프로젝트 속성의 "링크 -> 입력"의 "추가 종속성"항목에 lib파일 이름과 확장자 명을 추가 입력을 한다.

아래의 소스코드를 작성한다.

// MyCFuncsRef.cpp
#include "MyCFuncs.h"

int main(const int & argc, const char * argv[])
{
    Hello();
    return 0;
}


컴파일 후 프로그램을 실행할때에는 실행하는 폴더안에 해당 dll 파일이 반드시 있어야한다.



들여오기 예시2)

아래와 같이 매크로 "#pragma comment(lib, " ./MyCfuncs.lib")를 선언부 입력을 해준다.


// MyCFuncsRef.cpp
#pragma comment(lib, "./MyCFuncs.lib")

#include "MyCFuncs.h"

int main(const int & argc, const char * argv[])
{
    Hello();
    return 0;
}


컴파일 후 실행파일이 있는 폴더 안에 해당 dll 파일이 있어야 정상적으로 실행된다.



정리

 C의 경우 클래스와 같은 자료형을 지원하지 않기 때문에 단지 헤더파일 부분만 주의 깊게 작성하면 된다. 다만, C++에서는 해당 헤더파일이 C++에서 사용된다는 것을 알리기 위하여 매크로 변수 __cplusplus를 이용 하여 extern "c" { 항목을 활성 혹은 비활성 한다는 점을 기억하자.


 dll참조 함수의 성능을 높이기 위해 포인터로 함수 주소를 가져와서 호출하는 방법도 있는데, 이부분은 추가로 더 조사를 해봐야 될것 같다.



참고자료

MSDN C 함수를 ~ 내보내기




반응형

+ Recent posts