我想在def文件中导出一个装饰的函数名,如下所示:
LIBRARY Example
EXPORTS
??0__non_rtti_object@std@@QAE@ABV01@@Z=myfunc @1
问题是链接器在第一个@ -sign处删除了函数名称并且只是放置 “?? 0__non_rtti_object”进入导出表。我现在的问题是,如果有办法包括 @ -characters也是?我使用Visual Studio 2010.也许有人可以帮助我。
先谢谢,Hannes。
答案 0 :(得分:3)
您没有回答我关于.DEF文件使用的评论,因此我认为您必须不熟悉dllexport
和dllimport
限定符。使用它们,不需要.DEF文件来导出符号。
如果特别需要.DEF文件使dllimport
/ dllexport
功能无效,请忽略以下内容。
dllimport
/ dllexport
?在您的公开标题中(例如,public.hpp
),写下如下内容:
#ifdef MY_PROJECT_EXPORTS
#define MY_PROJECT_API __declspec(dllexport)
#else
#define MY_PROJECT_API __declspec(dllimport)
#endif
这样,宏MY_PROJECT_API
将启用符号的导出/导入。例如,稍后,在同一public.hpp
中,您可以声明:
// A global variable
MY_PROJECT_API int myGlobalVariable ;
// A function
MY_PROJECT_API void my_function() ;
// A class or struct
class MY_PROJECT_API MyClass
{
public :
int i;
virtual int foo() ;
// etc.
} ;
然后,你需要做的是,在你的库的项目选项中,定义MY_PROJECT_EXPORTS
:这样,当你编译你的库时,上面的符号被声明为dllexport
,当其他人包含您的public.hpp
标题,上面的符号将为dllimport
如果您的代码是跨平台的(dllimport
/ dllexport
是MS编译器功能),只需将上面的定义包装在编译器测试周围。例如:
#ifdef _MSC_VER
// For MS Visual Studio
#ifdef MY_PROJECT_EXPORTS
#define MY_PROJECT_API __declspec(dllexport)
#else
#define MY_PROJECT_API __declspec(dllimport)
#endif
#else
// For other compilers
#define MY_PROJECT_API
#endif
。之前的使用.DEF文件,当可导出的C函数仍然是Visual Studio上的“方法”时。
对于强类型安全性,C ++装饰其符号。
缺点是每个编译器都有自己的装饰方案(在12年的开发中从未打扰过我),找到符号的精确装饰名称并不会让人感到痛苦。
但其优点在于:
dllimport
和dllexport
功能具有以下优势:
有关详细信息,请参阅:
__declspec
:http://msdn.microsoft.com/en-us/library/dabb5z75.aspx dllexport
,dllimport
:http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx dllimport
和dllexport
:http://msdn.microsoft.com/en-us/library/81h27t8c.aspx