有没有办法抑制c ++名称修改?

时间:2009-05-23 20:51:53

标签: c++ visual-studio winapi name-mangling

我有一个用C ++编写的DLL,我想压缩一些导出方法的名称。这些方法是全局的,不是任何类的成员。有没有办法实现这个目标?

BTW:我正在使用VS2008。

3 个答案:

答案 0 :(得分:25)

使用extern“C”{}

包围函数定义
extern "C" {
    void foo() {}
}

请参阅http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

答案 1 :(得分:10)

您可以使用带有EXPORTS部分的.def文件来避免导出函数的所有重整(C ++,cdecl,stdcall,...)。只需创建一个MyDll.def文件并将其添加到您的项目中:

LIBRARY "MyDLL"
EXPORTS
  Foo
  Bar

实际上,向导很可能已经为你创建了一个def文件。你只需要填写EXPORTS部分。

答案 2 :(得分:10)

“bradtgmurray”是正确的,但对于Visual C ++编译器,无论如何都需要显式导出函数。但是使用“Serge - appTranslator”提出的.DEF文件是错误的做法。

在Visual C ++上导出符号的通用方法是什么?

使用declspec(dllexport / dllimport)指令,它适用于C和C ++代码,无论是否装饰(而.DEF仅限于C,除非你想手工装饰你的代码)。

因此,在Visual C ++中导出未修饰函数的正确方法是将“bradtgmurray”和dllimport / dllexport关键字的导出“C”成语组合在一起。

一个例子?

作为一个例子,我在Visual C ++上创建了一个空的DLL项目,并编写了两个函数,一个被称为CPP,因为它被装饰,另一个C因为它没有。代码是:

// 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 ;
}

} ;