使用具有不同编译器版本的C DLL
这个问题与
“How to make consistent dll binaries across VS versions ?”有关
>我们已经构建了应用程序和DLL 虽然静态函数可以用类似的东西来处理 // Header file class DLL_API Foo { int init(); } extern "C" { int DLL_API Foo_init(); } // Implementation file int Foo_init() { return Foo::init(); } 使用非静态方法并不容易. 据我了解,Chris Becke’s建议使用类似COM的接口对我没有帮助,因为接口成员名称仍然会被装饰,因此无法从使用不同编译器创建的二进制文件中访问.我在那儿吗? 唯一的解决方案是使用处理程序写一个C风格的DLL接口到对象还是我错过了什么? 解决方法
接口成员名称不会被装饰 – 它们只是在vtable中的偏移量.您可以在头文件中定义接口(使用C结构,而不是COM“接口”),因此:
struct IFoo { int Init() = 0; }; 然后,您可以从DLL导出函数,不会出现错误: class CFoo : public IFoo { /* ... */ }; extern "C" IFoo * __stdcall GetFoo() { return new CFoo(); } 如果您使用的是生成兼容vtable的编译器,这将正常工作. Microsoft C生成了相同的格式vtable,因为(至少,我认为)MSVC6.1 for DOS,其中vtable是一个简单的函数指针列表(在多继承情况下使用thunking). GNU C(如果我没记错的话)生成带有函数指针和相对偏移的vtable.这些彼此不兼容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |