从不同的编译器导入dll

时间:2012-01-17 13:44:16

标签: c++ linker c++builder

我已经使用Borland 6将我使用MinGW创建的库编译到现有应用程序中(我知道它的旧版本,但它就是用它制作的)。我使用implib创建.lib文件并将其导入我的项目。我还添加了dll的路径和必要的头文件。

当我尝试编译时,我得到了一堆未解决的外部类型错误。我错过了导入过程的任何步骤吗?假设我没有,并且问题就像名称错误一样,我如何以这样的方式编写接口,名称修改无关紧要。我知道它涉及外部C但这就是我的知识极限。只需要从dll外部访问两个类,其余的都只在内部使用。我不确定如何使用完全由类构建的东西来使用extern C.我仍然希望这是我用borland 6进口的。

2 个答案:

答案 0 :(得分:0)

在编译器中,名称修改不是标准化的。仅公开 extern C 函数,以便它们不会受到名称损坏。但是这有一个限制,你不能使用面向对象编程。

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

答案 1 :(得分:0)

extern“C”不能用于类,仅用于自由函数。所以你可以选择在你的类中编写一个“C”接口,其中每个函数都有一个指向你的类的指针,你可能会创建和销毁函数。

这是一种通常完成的方式,你的类可以向前声明为struct,它与类相同,然后甚至可以被用C编写的应用程序使用。你通常只使用extern“C”当定义__cplusplus时,通常会有#ifdef防护。

还有另一种选择,如果您只希望C ++使用您的类,并且您不想为所有类方法编写C接口。

DLL的用户使用抽象接口,仍然使用Create和Destroy方法(使用extern“C”)来创建指向抽象接口的指针,然后以正常的C ++方式使用指针。当然,理想情况下,您将此指针包装在智能指针中,例如使用调用Destroy方法的自定义删除器来提升shared_ptr。 (库的用户应该这样做但你可以提供一个只有头的界面来实现它。)

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