문제

C ++로 작성된 DLL이 있으며 몇 가지 내보내기 방법에 대한 이름 Mangling을 억제하고 싶습니다. 이 방법은 전 세계적이며 모든 수업의 구성원이 아닙니다. 이것을 달성 할 수있는 방법이 있습니까?

BTW : VS2008을 사용하고 있습니다.

도움이 되었습니까?

해결책

"Bradtgmurray"는 옳지 만 Visual C ++ 컴파일러의 경우 어쨌든 기능을 명시 적으로 내보내야합니다. 그러나 "Serge -AppTranslator"가 제안한 .def 파일을 사용하는 것은 잘못된 방법입니다.

Visual C ++에서 기호를 내보내는 보편적 인 방법은 무엇입니까?

C 및 C ++ 코드 모두에 적합한 DeclSpec (dllexport/dllimport) 명령어를 사용하여 장식 여부에 관계없이 .def는 코드를 손으로 장식하지 않는 한 C로 제한됩니다).

따라서 Visual C ++에서 미리 세포 된 기능을 내보내는 올바른 방법은 "Bradtgmurray"와 Dllimport/Dllexport 키워드가 답한대로 수출 "C"관용구를 결합하는 것입니다.

예?

예를 들어, 나는 Visual C ++의 빈 DLL 프로젝트를 만들었고, 하나는 CPP라고 불리는 두 가지 기능을 작성했으며, 다른 하나는 그렇지 않았기 때문에 다른 C는 CPP라고 불렀습니다. 코드는 다음과 같습니다.

// Exported header
#ifdef MY_DLL_EXPORTS
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif

// Decorated function export : ?myCppFunction@@YAHF@Z
MY_DLL_API int myCppFunction(short v) ;

// Undecorated function export : myCFunction
extern "C"
{
MY_DLL_API int myCFunction(short v) ;
} ;

나는 당신이 이미 알고 있다고 생각하지만, 완전성을 위해 My_dll_api 매크로는 dll makefile (즉, vcproj)에서 정의되어야하지만 dll 사용자는 아닙니다.

C ++ 코드는 쓰기가 쉽지만 완전성을 위해 아래에 쓸 것입니다.

// Decorated function code
MY_DLL_API int myCppFunction(short v)
{
   return 42 * v ;
}

extern "C"
{

// Undecorated function code
MY_DLL_API int myCFunction(short v)
{
   return 42 * v ;
}

} ;

다른 팁

extern "c"{}로 함수 정의를 둘러싸십시오.

extern "C" {
    void foo() {}
}

보다 http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

내보내기 섹션이있는 .def 파일을 사용하여 내보내는 함수에 대해 모든 Manglings (C ++, CDECL, StdCall, ...)를 피할 수 있습니다. mydll.def 파일을 만들고 프로젝트에 추가하십시오.

LIBRARY "MyDLL"
EXPORTS
  Foo
  Bar

실제로 마법사가 이미 DEF 파일을 만들었습니다. 수출 섹션을 작성하면됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top