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文件是错误的方法.
使用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)
| 归档时间: |
|
| 查看次数: |
8779 次 |
| 最近记录: |