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

Oha*_*esh 5 c++ winapi name-mangling visual-studio

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

顺便说一句:我正在使用VS2008.

bra*_*ray 25

用extern"C"{}包围函数定义

extern "C" {
    void foo() {}
}
Run Code Online (Sandbox Code Playgroud)

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


Ser*_*ier 10

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

LIBRARY "MyDLL"
EXPORTS
  Foo
  Bar
Run Code Online (Sandbox Code Playgroud)

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


pae*_*bal 10

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

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

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

因此,在Visual C++中导出未修饰函数的正确方法是将导出的"C"习惯用法与dllimport/dllexport关键字结合起来,如"bradtgmurray"所回答.

一个例子 ?

作为一个例子,我在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) ;
} ;
Run Code Online (Sandbox Code Playgroud)

我想你已经知道了,但为了完整起见,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 ;
}

} ;
Run Code Online (Sandbox Code Playgroud)