繁体   English   中英

从其他编译器导入dll

[英]Importing a dll from a different compiler

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

当我尝试编译时,会出现一堆未解决的外部类型错误。 我错过了导入过程中的任何步骤吗? 假设我还没有,问题出在诸如名称改写之类的问题上,我该如何编写一种以使名称改写无关紧要的方式编写接口。 我知道它涉及extern C,但这仅是我的知识的极限。 仅需要从dll外部访问两个类,其余所有类仅在内部使用。 我不确定如何将extern C与完全由类构建的东西一起使用。 我仍然希望这是我与borland 6的结合。

名称修饰在各个编译器之间均未标准化。 仅公开extern C函数,以使它们不被名称混淆。 但这有一个限制,即您不能使用面向对象的编程。

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

extern“ C”不能用于类,只能用于自由函数。 因此,您可以选择为您的类编写“ C”接口,其中每个函数都使用一个指向您类的指针,并且您可能会创建和销毁函数。

这种方法通常可以完成,您的类可以向前声明为struct,与类相同,然后甚至可以用C编写的应用程序使用。通常,仅当__cplusplus为定义,因此通常在其周围有#ifdef防护装置。

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

DLL的用户使用抽象接口,并且仍然使用Create和Destroy方法(带有extern“ C”)创建指向抽象接口的指针,但随后以常规C ++方式使用该指针。 当然,理想情况下,您可以将此指针包装在智能指针中,例如,带有调用Destroy方法的自定义删除程序的boost shared_ptr。 (库的用户应该这样做,但是您可以提供仅标头的接口来执行此操作)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM