Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Antonich от Октябрь 05, 2010, 21:04



Название: Не работает ftd2xx.dll в релиз версии
Отправлено: Antonich от Октябрь 05, 2010, 21:04
Написал простенькую программку для обмена с устройством. Для связи используется USB мост FT232RL.
К нему идет ftd2xx.dll. Проблемма в том что под дебагом все работает обмены идут. А когда компилирую в
релиз версию, то получаю ошибку segmentation fault. И выходит дамп ассемблера. Вопрос что можно предпринять?

Подключение DLL, самое начало. Там функций много.

Код:
  
 QLibrary FtLib("ftd2xx");

 if(FtLib.load() == true) {
  FtGetNumDev = (MyFtdiGetNum) FtLib.resolve("FT_CreateDeviceInfoList");
  if(FtGetNumDev == 0)
   errString = FtLib.errorString();
 }

.pro файл
Код:
QT       += core gui
TARGET = DTC
TEMPLATE = app
SOURCES += main.cpp\
        mainwindow.cpp \
    ftdidrv.cpp \
    SetSerial.cpp \
    Draw.cpp
HEADERS  += mainwindow.h \
    ftdidrv.h \
    ftdi.h \
    SetSerial.h \
    Draw.h
FORMS    += mainwindow.ui
RESOURCES   += dtcImage.qrc

Вызов функции на подключение устройства
Код:
void MainWindow::on_pushSensOn_clicked()
{
  if(FtdiDev -> ConnectFtdi(this) == 0)
     return ;
  int i = (ui->cmbBoxSpeed->currentText()).toInt();
  int j = (ui->cmbBoxDataBits->currentText()).toInt();
  int k = (ui->cmbBoxStopBits->currentText()).toInt();
  FtdiDev-> SetBaud(this,i,j,ui->cmbBoxEven->currentText(),k);
  ui->pushSensOff->setEnabled(true);
  ui->pushSensOn->setEnabled(false);
}

Тело вызываемой функции
Код:
char FtdiDrv::ConnectFtdi(QWidget * pntWiget)
{
 FT_STATUS ulFtStatus;
 int numDevs;

 ulFtStatus = (*FtGetNumDev)(&numDevs);
 if(ulFtStatus != FT_OK){
  QMessageBox::warning(pntWiget,"Внимание",
                                "Ошибка драйвера. Не возможно определить \n"
                                "количество подключенных устройств. \n"
                                "Перезапустите программу",
                                QMessageBox::Ok,QMessageBox::Ok);
  return 0;
 } //Message o sboe drayvera ne mogem poluchi NumDev

 if(numDevs <= 0) {
  QMessageBox::warning(pntWiget,"Внимание",
                                "Программатор не подключенн \n"
                                "Присоедините программатор к Usb",
                                QMessageBox::Ok,QMessageBox::Ok);
  return 0;
 }
}


Название: Re: Не работает ftd2xx.dll в релиз версии
Отправлено: Mikhail от Октябрь 05, 2010, 21:32
А какой Qt используешь при релиз сборке программы.
Дебажную или релизную.


Название: Re: Не работает ftd2xx.dll в релиз версии
Отправлено: Antonich от Октябрь 06, 2010, 06:34
QT 4.7.0 Скачал вместе c Creator все далаю в нем. в свойствах проекта переключаю с дебаг в релиз. Компилирую появляются файлы в папке release проекта. К ним подсовываю qtgui4.dll qtcore4.dl minigw.dll  и еще какую то либовую он при запуске ее просит. В туже папку кидаю ftd2xx.dll при нажатии на кнопку подключить когда вызывается метод FtDev -> Connect() валится в Segmetation fault. Если в дебаг версию прокинуть Qtgui4d.dll и т.д. дебажные dll  то все работает.


Название: Re: Не работает ftd2xx.dll в релиз версии
Отправлено: Mikhail от Октябрь 06, 2010, 07:52
Если подсовываешь dll, то значит, в путях не все прописано, либ прописано что то не то, может другая версия Qt.
Посмотри пути. Попробуй убрать из путей Qt и из переменных среды QTDIR.
Да Проверь в creatore для этого проекта параметры Qt. Если запускаешь из Creatora.


Название: Re: Не работает ftd2xx.dll в релиз версии
Отправлено: deaks от Октябрь 06, 2010, 10:12
а лучше переустановите qt строго по инструкции) по-моему многие забывают про системные переменные


Название: Re: Не работает ftd2xx.dll в релиз версии
Отправлено: Antonich от Октябрь 06, 2010, 14:52
Какие конкретно параметры? В каком меню?

Если подсовываешь dll, то значит, в путях не все прописано, либ прописано что то не то, может другая версия Qt.
Посмотри пути. Попробуй убрать из путей Qt и из переменных среды QTDIR.
Да Проверь в creatore для этого проекта параметры Qt. Если запускаешь из Creatora.


Название: Re: Не работает ftd2xx.dll в релиз версии
Отправлено: Antonich от Октябрь 06, 2010, 14:54
Ставил из инстальника с сайта qt.nokia.com
Все что в визарде предлагалось все сделал.
 
а лучше переустановите qt строго по инструкции) по-моему многие забывают про системные переменные


Название: Re: Не работает ftd2xx.dll в релиз версии
Отправлено: xokc от Октябрь 06, 2010, 16:40
Было подобное с чужой DLL, откомпилированной в MSVC когда ее подключал к своей программе на... MSVC. Всё дело было в неправильно указанном соглашении о вызовах в описании импортируемой из DLL функции (stdcall вместо cdelc или наоборот - не помню). Причем под debug все работало, а вот в release - нет. Самое смешное, что под mingw все работало хорошо и так и эдак.


Название: Re: Не работает ftd2xx.dll в релиз версии
Отправлено: crossly от Октябрь 06, 2010, 16:46
потому что плюшек вроде cdelc в gcc нету...


Название: Re: Не работает ftd2xx.dll в релиз версии
Отправлено: erinyes от Май 23, 2012, 17:15
Здравствуйте. Столкнулся с такой же проблемой с этой библиотекой. Код другой, но суть та же: релиз версия падает, с дебаг все нормально (падает, причем, на последующем вызове new для валидатора, а не на самом вызове функции из библиотеки, не знаю важно ли это).
Мне кажется, проблема в чем-то вроде этого ответа.

Было подобное с чужой DLL, откомпилированной в MSVC когда ее подключал к своей программе на... MSVC. Всё дело было в неправильно указанном соглашении о вызовах в описании импортируемой из DLL функции (stdcall вместо cdelc или наоборот - не помню). Причем под debug все работало, а вот в release - нет. Самое смешное, что под mingw все работало хорошо и так и эдак.

Можно ли как-нибудь это исправить? И, если можно, поподробнее объяснить в чем засада?
Да, компилятор mingw как раз.


Название: Re: Не работает ftd2xx.dll в релиз версии
Отправлено: Странник от Май 24, 2012, 00:54
у меня кстати тоже аномалия какая-то проявилась. использую mingw, и в релизе, и в дебаге одна и та же история. при наличии отладочных выводов qDebug() все прекрасно работает, стоит закомментировать хоть один - падает с ошибкой сегментации.


Название: Re: Не работает ftd2xx.dll в релиз версии
Отправлено: erinyes от Май 24, 2012, 11:19
В общем, как я и предполагал проблема оказалась в руках :)
Дело в том, что при объявлении функций в хедере библиотеки используется макрос WINAPI. Увидев нечто вроде
#define WINAPI FAR PASCAL
я подумал "wtf?" и опустил это дело при определении указателей на функции, хотя подозрение было что не заработает. Погуглив, сегодня по поводу этого WINAPI, добавил __stdcall в описание и все заработало. Смутило опять же то, что в дебаге все было нормально.