Qt4: функция определенная в одном файле не видна в другом?

Вот тут лежит проект ubuntuone.com/p/hiv/ (нужен libfprint-dev для компиляции)


При сборке вылазит сообщение об ошибке:

/home/robotex/workspace/qt_fprint-build-desktop/cfingerprintscanner.o:: In function `CFingerprintScanner::comparePrintData(CFingerprintData, CFingerprintData)':<br/>
/home/robotex/workspace/qt_fprint-build-desktop/../qt_fprint/cfingerprintscanner.cpp:475: error: undefined reference to `bozorth_main(xyt_struct*, xyt_struct*)'<br/>
:: error: collect2: ld returned 1 exit status<br/>


в частности вот на этом этапе:

g++ -o qt_fprint main.o mainwindow.o cfingerprintscanner.o cfingerprintdata.o bz_sort.o bz_io.o bz_gbls.o bz_drvrs.o bz_alloc.o bozorth3.o moc_mainwindow.o moc_cfingerprintscanner.o -L/usr/lib -lfprint -lQtGui -lQtCore -lpthread <br/>
cfingerprintscanner.o: In function `CFingerprintScanner::comparePrintData(CFingerprintData, CFingerprintData)':<br/>
/home/robotex/workspace/qt_fprint-build-desktop/../qt_fprint/cfingerprintscanner.cpp:475: undefined reference to `bozorth_main(xyt_struct*, xyt_struct*)'<br/>
collect2: ld returned 1 exit status<br/>
make: *** [qt_fprint] Помилка 1<br/>



Хотя функция существует в файле bz_drvrs.c Заголовочные файлы тоже подключены


В чем проблема? Где я накосячил?
  • Вопрос задан
  • 2931 просмотр
Решения вопроса 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
У Вас bz_drvrs.c написан на C, а сам проект — на C++. Для вызова C-функций из C++-кода необходимо использовать extern «C», поскольку формирование внутренних имён в .o-файлах для этих языков различается.

Чтобы сделать переносимый код, обычно делают примерно так:

#ifdef __cplusplus
extern "C" {
#endif

// основное содержимое .h-файла

#ifdef __cplusplus
} // extern "C"
#endif


В результате .h-файл нормально работает и в C, и в C++.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@YourChief
давайте мэйкфайл или скрипт которым собираете, попробую у себя компильнуть
Ответ написан
Комментировать
Eol
@Eol
Вы пользуетесь внешней динамической библиотекой Libfprint. Вам нужно сказать линковщику линковать вместе с ней. Для этого в .pro файл вашего Qt проекта (если вы пользуетесь QMake/Qt-Creator) нужно добавить строчку
LIBS += -lfprint
я могу ошибаться с «fprint» — конкретное название я не знаю, но суть та же.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы