ere*_*eOn 5 c++ linker gcc iconv visual-studio
我有一个依赖于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
Run Code Online (Sandbox Code Playgroud)
经过一番研究,我重新编译libiconv(在 x86 和 x64 版本中),添加了-static-libgcc标志。
它有效,但仅适用于我的程序的 x64 版本。x86 版本总是以同样的错误失败。
我应该怎么做才能使这项工作?
是的,这是可能的,因为如果您严格编译为 C 接口, iconv 将链接到msvcrt.libWindows C 运行时(严格意义上的 C,类似于glibcGCC 使用的)。如果您使用 GCC 的普通 C++ 编译器构建它,它会链接到libstdc++mangle,并且与 VC++ 相比,它的命名也不同,VC++ 链接到msvcr.dll.
在您的例子中,__chkstk是检查堆栈函数(C 运行时的一部分),该函数被注入到每个函数调用中以检查堆栈溢出。我不确定如何以“好”方式解决此问题,但您可以更改 iconv 的构建选项以使用附加编译器标志进行构建并抑制此检查:/Gs999999
然而,我已经用 Visual C++ 2005/2008/2010 构建了 libiconv,并且我在其之上构建的软件运行得很好(军事机构使用的软件,如果你需要可信度的话)。我确实记得使用 VC++ 编译器构建有点烦人,但应该不会太痛苦。
| 归档时间: |
|
| 查看次数: |
3756 次 |
| 最近记录: |