加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用具有不同编译器版本的C DLL

发布时间:2020-12-16 03:26:18 所属栏目:百科 来源:网络整理
导读:这个问题与 “How to make consistent dll binaries across VS versions ?”有关 我们已经构建了应用程序和DLL 用VC6和新的应用程序构建 用VC9. VC9-app必须使用 用VC6编译的DLL,大多数 用C写的,一个用 C . C lib由于存在问题 名称装饰/破损问题. 使用VC9编
这个问题与 “How to make consistent dll binaries across VS versions ?”有关

>我们已经构建了应用程序和DLL
用VC6和新的应用程序构建
用VC9. VC9-app必须使用
用VC6编译的DLL,大多数
用C写的,一个用
C .
> C lib由于存在问题
名称装饰/破损问题.
>使用VC9编译所有内容是
目前不是那里的选择
似乎是一些副作用.
解决这些问题将是时候了
耗时.
>我可以修改C库,但必须使用VC6编译.
> C lib本质上是另一个C库的OO包装器. VC9-app使用一些静态函数以及一些非静态函数.

虽然静态函数可以用类似的东西来处理

// 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接口到对象还是我错过了什么?
在这种情况下,我想,我可能会更少的努力直接使用包装的C库.

解决方法

接口成员名称不会被装饰 – 它们只是在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.这些彼此不兼容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读