Visual C ++:在def文件中导出修饰的函数名称

时间:2011-09-14 08:16:54

标签: c++

我想在def文件中导出一个装饰的函数名,如下所示:

LIBRARY Example
EXPORTS
??0__non_rtti_object@std@@QAE@ABV01@@Z=myfunc @1

问题是链接器在第一个@ -sign处删除了函数名称并且只是放置 “?? 0__non_rtti_object”进入导出表。我现在的问题是,如果有办法包括 @ -characters也是?我使用Visual Studio 2010.也许有人可以帮助我。

先谢谢,Hannes。

1 个答案:

答案 0 :(得分:3)

序言

您没有回答我关于.DEF文件使用的评论,因此我认为您必须不熟悉dllexportdllimport限定符。使用它们,不需要.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文件?

。之前的使用.DEF文件,当可导出的C函数仍然是Visual Studio上的“方法”时。

对于强类型安全性,C ++装饰其符号。

缺点是每个编译器都有自己的装饰方案(在12年的开发中从未打扰过我),找到符号的精确装饰名称并不会让人感到痛苦。

但其优点在于:

  1. 您现在可以导出重载/命名空间的函数/符号
  2. 参数类型是ABI的一部分,这意味着链接器可以验证您没有搞砸或欺骗您的类型
  3. dllimportdllexport功能具有以下优势:

    1. 它可以在源级别完成导出,而不是使用另一个项目文件
    2. 程序员现在可以忽略特定的装饰方案(通常只对链接器感兴趣),同时从扩展到链接器的C ++的强类型安全性中获利。
    3. 来源

      有关详细信息,请参阅: