c++ - 是否可以将 gcc 编译库与 MSVC 一起使用?

标签 c++ visual-studio gcc linker iconv

我有一个项目依赖于 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/

相关文章:

C++ 在子类中创建一个可用的方法

c++ - 矮人调试信息缺少构造函数上的数据

c++ - 访问类私有(private)成员中的结构成员?

c++ - 当程序变得无响应时如何确定程序在做什么?

visual-studio-2010 - WIX Heat.exe命令参数-var不接受空格吗?

asp.net - ADO.NET/WCF 数据服务的项目设置

asp.net-mvc - 使用 Visual Studio Web 部署部署到 asp MVC 中的 azure 网站时,某些文件夹不会推送到服务器

c++ - 条件默认构造函数可以在 GCC 中编译,但不能在 MSVC 中编译

c - 无法使用 Openwrt 工具链 : Undefined reference to _Unwind_Resume and __gcc_personality_v0 构建静态二进制文件

c - "warning : No new line at end of file"是什么意思?