静态链接到 libzbar.a 时出错:未定义对“_imp__GetACP@0”的引用

Error when statically-linking to libzbar.a: undefined reference to `_imp__GetACP@0'

我从我的程序 link 到 zbar。我使用 mingw/msys 构建了 zbar。我的应用程序是使用 Qt Creator 构建的。

当我使用 libzbar.dll.a 动态地 link 到 zbar 时,它编译并运行良好。当我 link 到 libzbar.a 时,构建我的应用程序失败并出现 linker 错误:

C:/Qt/Tools/mingw491_32/bin/../lib/gcc/i686-w64-mingw32/4.9.1/../../../../i686-w64-mingw32/lib/../lib/libiconv.a(localcharset.o):localcharset.c:(.text+0x7): undefined reference to `_imp__GetACP@0'
collect2.exe: error: ld returned 1 exit status

这个复杂的路径 - C:/Qt/Tools/mingw491_32/bin/../lib/gcc/i686-w64-mingw32/4.9.1/../../../../i686-w64-mingw32/lib/../lib/libiconv.a - 解析为 C:\Qt\Tools\mingw491_32\i686-w64-mingw32\lib\libiconv.a。所以 Qt Creator 似乎试图 link 反对它自己的 libiconv.a,它缺少一些 libzbar.a 需要使用的功能。

我不确定如何让 Qt Creator 使用 msys libiconv.a,我试过这个:

LIBS += c:/mingw/lib/libiconv.a
LIBS += $$PWD/zbar/lib/libzbar.a

但它没有效果,我得到了同样的错误。我如何说服 Qt Creator 使用 c:/mingw/lib/libiconv.a 而不是它自己的版本?

编辑: 这是重现错误的最小代码:

#define NULL 0
#include <zbar.h>
int main()
{
    zbar::ImageScanner scanner;
    return 0;
}

在 .pro 文件中我有:

INCLUDEPATH += c:/MinGW/msys/1.0/local/include
LIBS += -Lc:/MinGW/msys/1.0/local/lib -lzbar

尝试使用如下所示的 .pro 文件:

TEMPLATE=app
TARGET=appname
SOURCES=main.cpp
PRE_TARGETDEPS += c:/MinGW/msys/1.0/local/lib/libzbar.a
PRE_TARGETDEPS += c:/MinGW/msys/1.0/local/lib/libiconv.a
INCLUDEPATH += c:/MinGW/msys/1.0/local/include
win32:LIBS += c:/MinGW/msys/1.0/local/lib/libzbar.a
win32:LIBS += c:/MinGW/msys/1.0/local/lib/libiconv.a
// ... continue

非常感谢@skypjack,他的解决方案有效。我只会添加一些我通过测试发现的东西:

PRE_TARGETDEPS 并不是真正必要的,这 3 行足以使项目编译:

INCLUDEPATH += c:/MinGW/msys/1.0/local/include
LIBS += c:/MinGW/msys/1.0/local/lib/libzbar.a
LIBS += c:/MinGW/lib/libiconv.a

这很奇怪,因为我清楚地记得在将我的问题发布到 SO 之前尝试过这个。但是在 交换最后 2 行之后:

INCLUDEPATH += c:/MinGW/msys/1.0/local/include
LIBS += c:/MinGW/lib/libiconv.a
LIBS += c:/MinGW/msys/1.0/local/lib/libzbar.a

返回错误。我确实把 libiconv.a 放在 libzbar.a 之前,所以错误真的是因为 link-order.

编辑: 最后,连Qt Creator自带的libiconv也能用,只是需要在zbar后面加上:

LIBS += -Lc:/MinGW/msys/1.0/local/lib -lzbar -liconv