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

标签 c++ windows visual-c++-6 visual-c++-2008 name-decoration

这个问题与"How to make consistent dll binaries across VS versions ?"有关

  • 我们构建了应用程序和 DLL 使用 VC6 和构建的新应用程序 用VC9。 VC9-app 必须使用 用VC6编译的DLL,大部分 这是用 C 写的,一个在 C++。
  • C++ 库有问题,原因是 名称修饰/修改问题。
  • 用 VC9 编译所有东西是 目前没有选择 似乎是一些副作用。 解决这些将是相当大的时间 消费。
  • 我可以修改 C++ 库,但是它必须用 VC6 编译。
  • C++ 库本质上是另一个 C 库的 OO 包装器。 VC9 应用程序使用一些静态函数以及一些非静态函数。

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

// 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 的接口(interface)的建议对我没有帮助,因为接口(interface)成员名称仍将被修饰,因此无法从使用不同编译器创建的二进制文件访问。 我在吗?

唯一的解决方案是使用对象的处理程序编写 C 风格的 DLL 接口(interface),还是我遗漏了什么? 在那种情况下,我想,直接使用包装的 C 库可能会更省力。

最佳答案

使用与调用 EXE 不同的 C++ 编译器编译的 DLL 时,要考虑的最大问题是内存分配和对象生命周期。

我假设您可以通过名称修改(和调用约定),如果您使用具有兼容修改的编译器(我认为 VC6 与 VS2008 广泛兼容),或者如果您使用 extern,这并不困难“C”。

当您使用 new(或 malloc)从 DLL 分配某些内容,然后将其返回给调用者时,您会遇到问题。调用者的 delete(或 free)将尝试从不同的堆中释放对象。这将是非常错误的。

您可以执行 COM 样式的 IFoo::Release 操作,或 MyDllFree() 操作。这两者,因为它们回调 DLL,将使用 delete(或 free())的正确实现,因此它们将删除正确的对象。

或者,您可以确保使用 LocalAlloc(例如),以便 EXE 和 DLL 使用相同的堆。

关于c++ - 使用具有不同编译器版本的 C++ DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/331045/

相关文章:

c - 在 Windows 中跨重启访问相同的资源

c++ - 是时候告别 VC6 编译器了吗?

c++ - 动态填充结构数组

c++ - 添加新文件时需要更新 Qt .pro 和 Visual Studio .vcxproj

c++ - 仅替换成员函数的模板语法

c# - UWP 应用无法完全启动另一个 UWP 应用?

c++ - lambda 函数/表达式是否支持 constexpr?

windows - 用于加密 Azure 服务包的加密有多可靠?

c++ - 内存泄漏——释放和删除

c++ - VC6和模板错误