由各种编译器编译的链接库

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

如果我用C和MinGW写,我链接到VC编译的C ++库 – 它会工作吗? 我怎么事先知道?

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

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

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

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

如果我用C和MinGW写,我链接到VC编译的C ++库 – 它会工作吗?

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

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

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

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

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

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

  1. C ++库是用C风格的接口编写的,开发人员希望从不同的编译器调用它

  2. 与1相同。

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

我怎么事先知道?

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

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

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

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

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

是的,您可以为MinGW转换MSVC编译库而无需重新编译。
你只需要几个工具和dll。 看看这里 。

关于混合C和C ++ – 如果您不担心二进制文件的大小,只需对您的c项目使用c ++编译器。 这样您就不会担心链接的lib可能存在的问题。