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