【问题标题】:Link libraries compiled by various compilers各种编译器编译的链接库
【发布时间】:2010-11-28 01:30:56
【问题描述】:

我想更详细地询问我最近在这里得到的答案(第三个): Compiled languages basics

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

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

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

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

PS:是的,我看到了 Use libraries compiled... 我只是觉得我的问题略有不同。

【问题讨论】:

    标签: c dll linker compilation mingw


    【解决方案1】:

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

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

    【讨论】:

    • +1 用于链接到工具,但假设 C 将编译为 C++ 而没有错误是非常幼稚的。
    • 尝试将 C 源代码更改为可以编译为 C++ 的状态似乎是个好主意,因为这通常不是非常困难,因为这可能会简化构建过程显着。
    【解决方案2】:

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

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

    无法链接或链接后可能崩溃的原因:

    1. C++ 库正在导出 C++ 类和方法,使用 "mangled" names,但 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++ -style 方法或导出(更有可能兼容)C 风格的函数。

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

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

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

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

    【讨论】:

    • "谁编写了那个 VC 库?"这只是一个例子,但是说 python26.dll ......如果我能够运行生成的 .exe 是否意味着它可以 100% 工作?
    • 如果我能看到它的头文件(或者甚至是它导出的函数的名称列表),我可以说它是否看起来像是被设计为交叉编译器安全的 API。此外,您能够运行它并不能保证 100%(例如,可能存在堆损坏,直到稍后才会出现,或者例如在抛出异常之前它是可以的)......但是,能够运行它是这似乎是朝着正确方向迈出的一大步!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    相关资源
    最近更新 更多