U E D R S I H C RSS
ID
Password
Join
태풍이나 폭풍우는 피해 갈 수 있어도 서두름이란 악마를 앞서 갈 수는 없다. ―J.B.

C 언어로 이루어진 실행화일상에서 C++ 함수를 export하기 #

C++로 작성된 DLL내의 함수들을 C언어 모듈에서 접근하려할 때에는, C++ 링크정보대신 C 링크 정보를 선언해야만합니다. 이것이 정의되어있지 않다면 C++ 컴파일러는 C++ 타입안전성 명칭변경(C++ type-safe naming, name decoration이라고도 알려져있습니다)와 C++ 호출 규약을 사용하게 되며, 이는 C에서 호출하고자 하는 함수명과 달라지므로 링크오류가 발생할 수 있습니다.

C 링크정보를 정의하려면, 함수 선언앞에 extern "C"를 선언하면 됩니다. 예를 들면 다음과 같이 말이죠.

extern "C" __declspec( dllexport ) int MyFunc(long parm1);

C/C++ 실행화일상에서 C 함수를 export하기 #

만약 C로 작성된 DLL상의 함수들을 C 또는 C++ 모듈에서 접근하고자 할때에는, __cplusplus 전처리 매크로를 사용하여 C인지 C++인지여부를 알아낸다음, C++ 언어 모듈일경우라면 C 링크정보로 함수를 선언해주어야합니다. 여러분의 DLL을 위해 제공되는 헤더화일에서 이 기술을 사용한다면, 이 헤더에 담긴 함수선언은 C와 C++ 양쪽모두 수정없이 사용이 가능할겁니다.

다음 코드는 C와 C++ 클라이언트 어플리케이션에 의해 사용되는 헤더화일의 예를 보여주고 있습니다.
// MyCFuncs.h
#ifdef __cplusplus
extern "C" {  // 만약 C++ 소스코드에서 사용할 경우라면 C 인터페이스를 export할 필요가 있습니다.
#endif

__declspec( dllimport ) void MyCFunc();
__declspec( dllimport ) void AnotherCFunc();

#ifdef __cplusplus
}
#endif

위 방법을 사용하지 않고 C++ 실행화일에 C 함수들을 링크하려면, C++ 소스화일안에서 다음과 같이 적어줌으로서 C 함수명을 확장(decoration)하지 않도록 막아주어야합니다.
extern "C" {      
#include "MyCHeader.h"
}

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:52
Processing time 0.3275 sec