我有一个项目依赖于 libiconv
进行多项操作。
我在 Visual Studio 2008 中使用 iconv.lib
的预编译二进制文件,但现在我不得不转向 Visual Studio 2010,并且没有更多的预编译二进制文件可用。
我决定自己编译它,但正如 libiconv
文档所述,没有对 MSVC 编译器的官方支持。但是,我在某处读到 gcc
可以生成与 MSVC 编译器二进制兼容的静态库,只要二进制接口(interface)保留在 C
中即可。虽然这听起来很疯狂,但我试了一下,实际上几乎成功了。
我编译了它,将 libiconv.a
重命名为 iconv.lib
并尝试与它链接。 (如果这是个坏主意,请告诉我)。
首先遇到链接错误:
1>iconv.lib(iconv.o) : error LNK2001: unresolved external symbol ___chkstk
经过一些研究,我重新编译了 libiconv
(x86 和 x64 版本),添加了 -static-libgcc
标志。
它有效,但仅适用于我程序的 x64 版本。 x86 版本总是失败并出现完全相同的错误。
我应该怎么做才能使这项工作正常进行?
最佳答案
是的,这是可能的,因为如果严格按照 C 接口(interface)编译,iconv 将链接到 msvcrt.lib
,它是 Windows C 运行时(严格来说是 C,类似于 glibc
由 GCC 使用)。如果您使用 GCC 的普通 C++ 编译器构建它,它将链接到 libstdc++
并且与链接到 msvcr.dll
的 VC++ 相比,命名 mangle 也不同。
在你的例子中,__chkstk
is the check stack function (C 运行时的一部分),一个注入(inject)到每个函数调用中以检查堆栈溢出的函数。我不确定如何以“好”的方式解决这个问题,但您可以更改 iconv 的构建选项以使用额外的编译器标志进行构建并取消此检查:/Gs999999
但是,我使用 Visual C++ 2005/2008/2010 构建了 libiconv,并且我在其之上构建的软件运行良好(军事机构使用的软件,如果您需要可信度)。我记得虽然使用 VC++ 编译器构建有点烦人,但应该不会太痛苦。
关于c++ - 是否可以将 gcc 编译库与 MSVC 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4265639/