静态链接到libzbar.a时出错:未定义引用`_imp__GetACP @ 0'

时间:2015-10-16 15:36:06

标签: c++ qt-creator linker-errors iconv zbar

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

当我使用libzbar.dll.a动态链接到zbar时,它会编译并运行正常。当我链接到libzbar.a时,构建我的应用程序失败并出现链接器错误:

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似乎试图链接自己的libiconv.a,而libzbar.a缺少libiconv.a需要使用的一些函数。

我不确定如何让Qt Creator使用msys LIBS += c:/mingw/lib/libiconv.a LIBS += $$PWD/zbar/lib/libzbar.a ,我试过这个:

c:/mingw/lib/libiconv.a

但它没有效果,我得到了同样的错误。我如何说服Qt Creator使用#define NULL 0 #include <zbar.h> int main() { zbar::ImageScanner scanner; return 0; } 而不是自己的版本?

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

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

在.pro文件中我有:

:uia_strategy

2 个答案:

答案 0 :(得分:3)

非常感谢@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之前就清楚地记得尝试过这个问题。但在交换最后两行后

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 ,所以错误确实是因为链接顺序。

编辑:最后,它甚至可以与Qt Creator自己的libiconv一起使用,只是我需要在zbar之后添加它:

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

答案 1 :(得分:1)

尝试使用 .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