我有一个项目依赖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版本总是失败并出现相同的错误。
我该怎么做才能使这项工作?
答案 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 ++编译器构建有点烦人,但它不应该太痛苦。