5

我有一个用 C++ 编写的 DLL,我想抑制一些导出方法的名称修改。这些方法是全局的,不是任何类的成员。有没有办法做到这一点?

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

4

3 回答 3

25

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

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

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

于 2009-05-23T20:55:05.753 回答
11

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

LIBRARY "MyDLL"
EXPORTS
  Foo
  Bar

实际上,向导很可能已经为您创建了一个 def 文件。您只需填写“出口”部分。

于 2009-05-25T08:15:39.393 回答
10

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

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

使用 declspec(dllexport/dllimport) 指令,该指令适用于 C 和 C++ 代码,无论是否修饰(而 .DEF 仅限于 C,除非您想手动修饰代码)。

因此,在 Visual C++ 中导出未修饰函数的正确方法是结合导出“C”习语(如“bradtgmurray”所回答)和 dllimport/dllexport 关键字。

一个例子 ?

例如,我在 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 ;
}

} ;
于 2009-05-26T08:35:38.077 回答