1

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

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

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

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

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

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

4

2 回答 2

5

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

关于混合 C 和 C++ - 如果您不担心二进制文件的大小,只需为您的 c 项目使用 c++ 编译器。这样您就不必担心您链接到的库可能出现的问题。

于 2009-09-14T08:53:04.867 回答
1

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

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

它可能无法链接或链接时可能会崩溃的原因:

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

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

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

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

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

  2. 同 1。

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

我怎么提前知道?

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

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

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

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

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

于 2009-09-14T12:11:59.677 回答