2012-01-17 45 views
0

我已经编译了一个库,我已经用MinGW创建了一个使用Borland 6的现有应用程序(我知道它的旧版本,但它就是这样做的)。我用implib来创建.lib文件并将其导入到我的项目中。我也添加了路径到dll和必要的头文件。从一个不同的编译器导入一个DLL

当我尝试编译时,我得到一堆未解决的外部类型错误。我错过了导入过程的任何步骤吗?假设我没有,这个问题就像名字mangling一样,我该如何去写这个接口,这样一来名字的改变就没有关系了。我知道这涉及到extern C,但那是关于我的知识极限的。只有两个类需要从dll外部访问,其余部分仅在内部使用。我不知道如何用完全由类构建的东西来使用extern C.我stil希望它是我与borland 6的导入。

+0

关于您的问题,有一个很好的常见问题(带有代码示例)。请注意,它主要关注Linux。但我希望它能帮助你http://www.faqs.org/docs/Linux-mini/C++-dlopen.html – 2012-01-17 14:00:34

回答

0

extern“C”不能用于类,只能用于免费函数。所以你可以选择为你的类写一个“C”接口,每个函数接受一个指向你的类的指针,你可能会创建和销毁函数。

这是一种典型的做法,你的类可以被正向声明为struct,它与class相同,然后甚至可以被用C语言编写的应用程序使用。你通常会把extern“C”只有当__cplusplus被定义时,通常会有#ifdef保护。

还有另外一个选择,如果你只想让你的类被C++使用,并且你不想为所有的类方法编写一个C接口。

DLL的用户使用抽象接口,仍然使用Create和Destroy方法(用extern“C”)创建一个指向抽象接口的指针,但是接着以普通的C++方式使用指针。当然,理想情况下,您会将此指针包装在智能指针中,例如使用调用Destroy方法的自定义删除器来提升shared_ptr。 (图书馆的用户应该这样做,但你可以提供一个只有标题的界面来做到这一点)。

还有一些其他问题需要注意,如果这样做,例如任何与运行时类型信息有关的操作都可能无法在用户端运行,包括异常。再次,您的库可以提供“开源”C++包装(在客户端编译),以更多的C++方式处理这个问题。一种类型的pImpl。

+0

非常感谢,我可以看到这是一个教育日,我可能会把我的两个访问课程合为一体。为了避免做任何事情需要花费很长时间并且面临反弹的风险,将这个类作为一个单例并让我的C风格函数在这个单例上运行会有什么好处? – Bowler 2012-01-17 14:27:44

+0

它为什么需要成为一个单身人士?如果你只有其中一个,并且你需要它可以在全球范围内使用而不需要作为参数传递,那么就可以做到这一点。 – CashCow 2012-01-17 16:26:52

+0

只有当接口类的一个实例发生时,我一直试图在我有'管理器'类的类型时踢单身的习惯。我想知道它在这里可能是有用的,因为会有一个C函数调用的单个指针,也许它没有帮助解决问题。 – Bowler 2012-01-17 16:54:49

0

在整个编译器中名称修改不是标准化的。只暴露extern C函数,以便它们不会被名称损坏。但是这有一个限制,你不能使用对象定位编程。

另一种选择是实现COM对象,因为它们是二进制兼容的。