我想更详细地询问我最近在这里得到的答案(第3章): 编译语言基础知识

如果我用C和MinGW编写并且我链接到VC编译的C ++库 - 它会工作吗?我如何提前知道?

换句话说,如果我能够在没有警告的情况下创建链接到该C ++ .dll的.exe,并且我能够运行(只运行,不再进一步测试).exe,它是否意味着它工作?在某些时候它不会被核心转储吗?

为了完全确定,我是否需要自己重新编译库源及其链接?

我知道有时连接C ++和C代码可能会出现问题,但是如何知道它何时起作用?

PS:是的,我看到了 使用已编译的库... 我只是觉得我的问题略有不同。

有帮助吗?

解决方案

  

如果我用C和MinGW编写并链接到VC编译的C ++库 - 它会起作用吗?

这取决于编译器(我不知道MinGW)和特定的C ++库。

可能无法链接的原因,或者如果链接可能会崩溃:

  1. C ++库正在使用“mangled”导出C ++类和方法。名称,但MinGW的C ++名称修改可能(我不知道)与VC不同(当您使用C而不是C ++编码时不存在)

  2. VC代码不使用与MinGW相同的C运行时库,如果API通过VC代码在堆上分配内存,那么它会咬你,然后它应该被释放MinGW代码。

  3. VC的代码不能与MinGW的代码进行二进制兼容(不使用相同的参数传递约定,不以相同的方式实现异常)

  4. 另一方面,它可能起作用的一些原因:

    1. C ++库是用C风格的界面编写的,开发人员打算从不同的编译器调用它

    2. 与1相同。

    3. MinGW编译器的制造商使其与VC二进制兼容

    4.   

      我如何提前知道?

      我不知道。如果你发布从DLL导出的函数的名称,和/或声明其公共/导出的API的头文件,这将给我(或其他人)一个非常强烈的提示,关于它是否导出(可能是不兼容的)C ++风格的方法或导出(更有可能成为可能)的C风格函数。

      否则你有一个两阶段的问题:

      1. MinGW代码调用VC代码需要做什么(例如C而不是C ++,例如不假设它们使用相同的堆,例如指定参数传递约定)?

      2. 您的VC库是否在编写时考虑到了这一点?

      3. 使用过两个编译器的人可能会回答第一个问题(我没有使用过MinGW)。我不知道谁能回答第二个问题;谁写了那个VC库?

其他提示

是的,您可以在不重新编译的情况下为MinGW转换MSVC编译库 你只需要几个工具和dll。查看此处。点击 点击 关于混合C和C ++ - 如果您不担心二进制文件的大小,只需对您的c项目使用c ++编译器。这样您就不会担心链接的库可能存在问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top