我有一个用 C++ 编写的 DLL,我想抑制一些导出方法的名称修改。这些方法是全局的,不是任何类的成员。有没有办法做到这一点?
顺便说一句:我正在使用 VS2008。
我有一个用 C++ 编写的 DLL,我想抑制一些导出方法的名称修改。这些方法是全局的,不是任何类的成员。有没有办法做到这一点?
顺便说一句:我正在使用 VS2008。
用 extern "C" {} 包围函数定义
extern "C" {
void foo() {}
}
见http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html
您可以使用带有 EXPORTS 部分的 .def 文件来避免导出函数的所有修改(C++、cdecl、stdcall...)。只需创建一个 MyDll.def 文件并将其添加到您的项目中:
LIBRARY "MyDLL"
EXPORTS
Foo
Bar
实际上,向导很可能已经为您创建了一个 def 文件。您只需填写“出口”部分。
“bradtgmurray”是对的,但对于 Visual C++ 编译器,无论如何您都需要显式导出函数。但是使用“Serge - appTranslator”建议的 .DEF 文件是错误的方法。
使用 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 ;
}
} ;