5

我有一个依赖于libiconv多个操作的项目。

我正在iconv.lib为 Visual Studio 2008 使用预编译的二进制文件,但现在我不得不转向 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 版本总是失败并出现同样的错误。

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

4

1 回答 1

5

是的,这是可能的,因为如果您严格编译为 C 接口,iconv 将链接到msvcrt.libWindows C 运行时(严格来说是 C,类似于glibcGCC 使用的)。如果您使用 GCC 的普通 C++ 编译器构建它,则与libstdc++链接到msvcr.dll.

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


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

于 2010-11-24T14:39:05.697 回答