我有一个用C++编写的DLL,我想为一些导出的方法禁止名称修饰。这些方法是全局的,不属于任何类。有没有办法实现这个目的?
顺便说一下:我正在使用VS2008。
我有一个用C++编写的DLL,我想为一些导出的方法禁止名称修饰。这些方法是全局的,不属于任何类。有没有办法实现这个目的?
顺便说一下:我正在使用VS2008。
将函数定义与 extern "C" {} 包围起来。
extern "C" {
void foo() {}
}
请查看http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html
"bradtgmurray"说的没错,但对于Visual C++编译器,你仍然需要显式地导出你的函数。但是使用像“Serge - appTranslator”建议的.DEF文件是不正确的方法。
使用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) ;
} ;
我猜您已经知道,但为了完整起见,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 ;
}
} ;
你可以通过在项目中添加一个包含 EXPORTS 部分的 .def 文件来避免所有对导出函数的编译器修饰(如 C++、cdecl、stdcall 等)。只需创建一个名为 MyDll.def 的文件并将其添加到您的项目中:
LIBRARY "MyDLL"
EXPORTS
Foo
Bar
实际上,向导很可能已经为您创建了一个def文件。您只需要填写EXPORTS部分即可。