在def文件中导出修饰函数名
Visual C++: Exporting decorated function name in a def file
我想在def文件中导出一个修饰过的函数名:
LIBRARY Example
EXPORTS
??0__non_rtti_object@std@@QAE@ABV01@@Z=myfunc @1
问题是链接器在第一个@-符号处去掉了函数名,只放置了"? ?0__non_rtti_object"导入到导出表中。我现在的问题是,是否有办法把还有@-字符?我使用Visual Studio 2010。也许有人能帮我。
提前谢谢你,汉内斯。
引言
您没有回答我关于使用. 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文件?
. def文件是在之前使用的,当时可导出的C函数在Visual Studio上仍然是"主流"。
为了强类型安全,c++修饰了符号。
缺点是每个编译器都有自己的装饰方案(这在12年的开发中从来没有困扰过我),并且找到一个符号的确切的装饰名称不会很痛苦。
但这样做的优点是:
- 现在可以导出重载/命名空间函数/符号
- 参数类型是ABI的一部分,这意味着链接器可以验证你没有搞砸或欺骗你的类型
dllimport
和dllexport
特性具有以下优点:
- 它使导出在源级完成,而不是使用另一个项目文件 程序员现在可以忽略特定的装饰方案(通常只对链接器感兴趣),同时从扩展到链接器的c++的强类型安全中获益。
有关更多信息,请参见:
-
__declspec
: http://msdn.microsoft.com/en-us/library/dabb5z75.aspx -
dllexport
,dllimport
: http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx - 在c++类中使用
dllimport
和dllexport
: http://msdn.microsoft.com/en-us/library/81h27t8c.aspx
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 在具有全局类型def的类中使用成员函数指针
- 函数模板签名中忽略的成员类型def 的访问说明符
- 当函数通过.def文件导出时,如何使用dllImport导入函数
- Boost Python def 成员函数,它调用静态函数,其中 self 作为唯一的参数
- 发送的参数与函数 def 不匹配
- 使用def文件从可执行文件导出函数
- 用. def创建DLL来定义函数名
- 在def文件中导出修饰函数名
- 警告:当我在函数def中添加没有实际参数的形式参数时,从字符串常量到' char* '的转换已弃用