是否可以使用MSVC的gcc编译库?

时间:2010-11-24 10:16:04

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

我有一个项目依赖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版本总是失败并出现相同的错误。

我该怎么做才能使这项工作?

1 个答案:

答案 0 :(得分:3)

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

在您的情况下,__chkstk is the check stack function(C运行时的一部分),一个注入每个函数调用的函数,用于检查堆栈溢出。我不知道如何解决这个'好'的方式,但你可以改变iconv的构建选项,用另外的编译器标志构建并禁止这个检查:/Gs999999


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

相关问题