代码之家  ›  专栏  ›  技术社区  ›  ereOn

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

  •  4
  • ereOn  · 技术社区  · 14 年前

    我有一个依赖于 libiconv 几次手术。

    我在使用预编译的二进制文件 iconv.lib 对于Visual Studio 2008,但现在我不得不转到Visual Studio 2010,没有更多的预编译二进制文件可用。

    我决定自己编译,但是 它本身 文档说明,没有对MSVC编译器的官方支持。然而,我在某个地方读到 gcc 只要二进制接口保持在 C . 虽然听起来很疯狂,但我试了一下,结果几乎成功了。

    我编译了它,重新命名 libiconv.a iconv.lib文件 并试图与之联系起来。(如果这是个坏主意,请告诉我)。

    首先我遇到一个链接错误:

    1>iconv.lib(iconv.o) : error LNK2001: unresolved external symbol ___chkstk
    

    经过研究,我重新编译了 它本身 (在x86和x64版本中),添加 -static-libgcc 旗帜。

    它工作了,但只适用于我的程序的x64版本。x86版本总是失败,并出现同样的错误。

    我该怎么做才能成功?

    1 回复  |  直到 14 年前
        1
  •  3
  •   wkl    14 年前

    是的,这是可能的,因为如果您严格地编译为一个C接口,iconv将链接到 msvcrt.lib glibc 由GCC使用)。如果用GCC的普通C++编译器构建它,它将链接到 libstdc++ 而且,与VC++相比,Mangle的名称不同。 msvcr.dll .

    对你来说, __chkstk is the check stack function (C运行时的一部分),注入到每个函数调用中以检查堆栈溢出的函数。我不确定如何以“好”的方式解决此问题,但您可以将iconv的生成选项更改为使用附加编译器标志生成,并取消此检查: /Gs999999


    然而,我用Visual C++ 2005/2008/2010构建了一个框架,我在它上面构建的软件工作得很好(如果你需要可信度的话,那是军事机构使用的软件)。我确实记得使用VC++编译器有点恼人,但是它不应该太痛苦。