我从我的程序链接到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
答案 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