【问题标题】:Is it possible to use a gcc compiled library with MSVC?是否可以将 gcc 编译库与 MSVC 一起使用?
【发布时间】:2011-05-15 00:26:07
【问题描述】:

我有一个项目依赖libiconv 进行多项操作。

我在 Visual Studio 2008 中使用 iconv.lib 的预编译二进制文件,但现在我不得不转到 Visual Studio 2010 并且没有更多的预编译二进制文件可用。

我决定自己编译它,但正如libiconv 文档所述,MSVC 编译器没有官方支持。但是,我在某处读到 gcc 可以生成与 MSVC 编译器二进制兼容的静态库,只要二进制接口保留在 C 中。虽然这听起来很疯狂,但我试了一下,它实际上几乎奏效了。

我编译它,将libiconv.a 重命名为iconv.lib 并尝试与它链接。 (如果这是一个坏主意,请告诉我)。

首先我遇到了链接错误:

1>iconv.lib(iconv.o) : error LNK2001: unresolved external symbol ___chkstk

经过一番研究,我重新编译了libiconv(x86 和x64 版本),添加了-static-libgcc 标志。

它有效,但仅适用于我的程序的 x64 版本。 x86 版本总是失败并出现同样的错误。

我应该怎么做才能完成这项工作?

【问题讨论】:

    标签: c++ visual-studio gcc linker iconv


    【解决方案1】:

    是的,这是可能的,因为如果您严格编译为 C 接口,iconv 将链接到 msvcrt.lib,这是 Windows C 运行时(严格来说是 C,类似于 GCC 使用的 glibc)。如果您使用 GCC 的普通 C++ 编译器构建它,它将链接到 libstdc++,并且与链接到 msvcr.dll 的 VC++ 相比,它的名称也不同。

    在您的情况下,__chkstk is the check stack function(C 运行时的一部分)是一个注入到每个函数调用中以检查堆栈溢出的函数。我不确定如何以“好”的方式解决此问题,但您可以更改 iconv 的构建选项以使用额外的编译器标志进行构建并禁止此检查:/Gs999999


    但是,我使用 Visual C++ 2005/2008/2010 构建了 libiconv,并且我在它之上构建的软件运行良好(军事机构使用的软件,如果您需要可信度)。我确实记得使用 VC++ 编译器构建有点烦人,但应该不会太痛苦。

    【讨论】:

    • +1。感谢您的回答,毫无疑问您的可信度;)我对您如何编译 libiconv 感兴趣。您是如何使用 MSVC 编译器做到这一点的?不幸的是,libiconv 的作者在 2006 年夏天放弃了对 MSVC 编译器的支持。您是否为它构建了自己的 Makefile?
    • @ereOn,我会再次尝试构建并回复您。我最近确实使用 VC++ 构建了 libiconv(自 2008 年以来多次)。
    • 谢谢,我终于成功了。不是libiconv 的最新版本,因为作者放弃了对 MSVC 的支持,但我返回了一个仍然支持 MSVC 的旧版本。
    • 一旦你有一个工作一半的 gcc,你可以使用 gcc 重新编译以获得一个完全工作的 gcc。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2017-01-08
    • 1970-01-01
    • 2018-06-22
    • 2018-05-20
    • 2016-11-12
    相关资源
    最近更新 更多