Я ссылаюсь на zbar из моей программы. Я построил zbar, используя mingw / msys. Мое приложение построено с использованием Qt Creator.
Когда я динамически связываюсь с zbar, используя libzbar.dll.a
, он компилируется и работает нормально. Когда я ссылаюсь на libzbar.a
сборка моего приложения завершается с ошибкой компоновщика:
C: / Qt / Инструменты / mingw491_32 / бен /../ Библиотека / GCC / i686-w64-mingw32 / 4.9.1 /../../../../ i686-w64-mingw32 / Библиотека / .. /lib/libiconv.a(localcharset.o):localcharset.c:(.text+0x7): неопределенная ссылка на `_imp__GetACP @ 0 ' collect2.exe: ошибка: ld вернул 1 состояние выхода
Это запутанный путь — 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
необходимо использовать.
Я не уверен, как заставить 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
Попробуй с .профессионал файл как следующий:
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
не было необходимости, этих трех строк достаточно для компиляции проекта:
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
, так что ошибка действительно была из-за порядка ссылок.
Редактировать: В конце концов, это работало даже с собственной библиотекой Qt Creator, просто мне нужно было добавить ее после zbar:
LIBS += -Lc:/MinGW/msys/1.0/local/lib -lzbar -liconv