【问题标题】:C++ - building static library questionC++ - 构建静态库问题
【发布时间】:2010-08-21 11:01:26
【问题描述】:

我使用 MinGW (GCC 4.5.0) 编译系统构建了libbz2(静态变体),现在尝试将此库导入到我的 MSVS2008 项目中。

我已经完成了这些事情,并且一切正常,例如,zlib(这意味着创建的 C 库实际上是可互换的)。

但是,当我对libbz2 执行相同操作时,我遇到了一些未知的麻烦 - 当我编译我的 MSVS2008 项目时,我在链接阶段收到以下错误:

unresolved external symbol ___chkstk referenced in function _bzopen_or_bzdopen

我不知道为什么会发生这种情况(我认为是因为一些基本的 C 运行时不完全兼容),但也许有人知道如何修复这种错误?强>

也许有一种手动方法可以将基于 MinGW 的 ___chkstk 的实现合并到 libbz2 静态库中?

谢谢。

【问题讨论】:

    标签: c++ linker mingw


    【解决方案1】:

    我阅读了您的答案,但我认为手动合并目标文件有一种更简单(自动)的方法:使用 CFLAG -static-libgcc,它将链接必要的功能(您正在描述和手动执行的操作) .

    【讨论】:

      【解决方案2】:

      谢谢大家,我找到答案了。

      基本上,您可以简单地链接到构建库时使用的libgcc.a / libgcc.lib

      处理___chkstk 问题的更方便的方法只意味着执行ar x libgcc.a 之类的操作(生成许多.o 文件),然后将libbz2 目标文件与__chkstk.o 文件合并。

      【讨论】:

        【解决方案3】:

        我认为它应该在链接器选项中,例如LDFLAGS=-static,而 LDFLAGS=-static-libgcc 仍然提供动态链接的二进制文件...与任何 test.c:

        gcc -c test.c
        gcc -static-libgcc test.o
        ldd a.out
            libc.so.6 => /lib64/libc.so.6
            /lib64/ld-linux-x86-64.so.2
        
        gcc -c test.c
        gcc -static test.o
        ldd a.out
            not a dynamic executable
        

        对于图书管理员,只需使用 ar

        ar q libtest.a <path>/libgcc.a
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-09
          • 1970-01-01
          • 2010-11-24
          相关资源
          最近更新 更多