【问题标题】:How to link to VS2008 generated .libs from g++如何从 g++ 链接到 VS2008 生成的 .libs
【发布时间】:2009-11-25 11:05:40
【问题描述】:

我正在尝试在cygwin下使用mingw g++构建一个dll。

我的 .h 文件引用了使用 MS Visual Studio 2008 构建的 .dll 导出的对象。我链接到使用该 .dll 生成的 .lib。

当我运行 g++ 时,会遇到很多这样的错误

/cygdrive/c/dev/blox/ulfx/ulfx/JavaInterface.cpp:206: undefined reference to `__imp___ZNK18DLLSafeDoubleArray4sizeEv'

我要链接的 .dll 公开了一个名为

的函数
?size@DLLSafeDoubleArray@@QBEIXZ

我认为这里的问题是 g++ 名称修饰与 VS2008 名称修饰不兼容。

有什么方法可以强制 g++ 使用兼容的 mangling 吗?

我的机器上没有安装任何版本的 Visual Studio。

【问题讨论】:

    标签: c++ visual-c++ g++


    【解决方案1】:

    生日,

    不确定这是否可行,因为除了名称修饰之外,不同供应商的编译器之间可能存在太多差异。诸如:

    1. this处理,
    2. v-tables 的布局和内容,
    3. 类布局,
    4. 参数序列,
    5. 寄存器处理,
    6. 返回值处理,

    我很想看看这是否可能。

    【讨论】:

    【解决方案2】:

    也许这个页面有帮助:

    http://www.mingw.org/wiki/MSVC_and_MinGW_DLLs

    我曾经设法做某事,但它只是一个原型,当我发现一个库在做我想做的事情时我放弃了它。虽然我确实按照他们的指示进行了操作,但我自己制作了 dll。

    【讨论】:

    • 不错的链接。我从 .dll 创建了一个 .def 文件,并从 .def 创建了一个 .a 文件,并删除了旧的 .lib 以确保正在使用 .a 文件。但这并没有什么不同。嗯。
    • 是的,我清楚地记得工作起来很痛苦——我最终还是做到了,但在 VSExpress 代码中需要进行大量修改。不过我希望你能成功。
    【解决方案3】:

    我同意Rob Wells 的评论,C++ 中有很多东西可能会出错。

    应该更容易、更安全和可能的事情是使用普通的 C 函数,因为主要需要担心的是调用约定以及结构的潜在打包和对齐。

    【讨论】:

    • 我完全同意你的看法。不幸的是,我无法修改 dll。我想我唯一的解决方案是获得一份 VS2008 的副本。
    • 有免费的VS2008 Express。它可能会帮助你。 :)
    • 另外 +1 用于用 C 包装。C ABI 工作与编译器无关。
    【解决方案4】:

    不同C++ 编译器生成的目标代码链接兼容。

    这样做是故意:编译器使用不同的 ABI,如果名称 maingling 没有阻止您进行链接,您现在会想知道/调试为什么最简单的操作会导致您的可执行文件崩溃。

    您应该感谢不同的名称修改方案为您省去了调试工作。

    【讨论】:

    • 但我最终试图引用一个 dll。因此,我可以(理论上)使用 GNU dlltool 从 dll 生成兼容的 .a 文件,然后链接到该文件,正如上面劳拉回答的那样? (虽然我还没有设法让那一点工作)。
    • 不,你不能:这不是让“import A”和“export B”匹配的问题。问题是“导出 B”提供了“方形钉”,它不适合“导入 A”所需的“圆孔”——“this”处的实际字节是*不同的,并且外部工具对此无能为力。
    【解决方案5】:

    更好的方法是用 g++ 重新编译 dll。如果可以的话。

    【讨论】:

      猜你喜欢
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      相关资源
      最近更新 更多