Russian Qt Forum
Ноябрь 24, 2024, 00:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не работает ftd2xx.dll в релиз версии  (Прочитано 10709 раз)
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;
 }
}
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #1 : Октябрь 05, 2010, 21:32 »

А какой Qt используешь при релиз сборке программы.
Дебажную или релизную.
Записан
Antonich
Гость
« Ответ #2 : Октябрь 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  то все работает.
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #3 : Октябрь 06, 2010, 07:52 »

Если подсовываешь dll, то значит, в путях не все прописано, либ прописано что то не то, может другая версия Qt.
Посмотри пути. Попробуй убрать из путей Qt и из переменных среды QTDIR.
Да Проверь в creatore для этого проекта параметры Qt. Если запускаешь из Creatora.
Записан
deaks
Гость
« Ответ #4 : Октябрь 06, 2010, 10:12 »

а лучше переустановите qt строго по инструкции) по-моему многие забывают про системные переменные
Записан
Antonich
Гость
« Ответ #5 : Октябрь 06, 2010, 14:52 »

Какие конкретно параметры? В каком меню?

Если подсовываешь dll, то значит, в путях не все прописано, либ прописано что то не то, может другая версия Qt.
Посмотри пути. Попробуй убрать из путей Qt и из переменных среды QTDIR.
Да Проверь в creatore для этого проекта параметры Qt. Если запускаешь из Creatora.
Записан
Antonich
Гость
« Ответ #6 : Октябрь 06, 2010, 14:54 »

Ставил из инстальника с сайта qt.nokia.com
Все что в визарде предлагалось все сделал.
 
а лучше переустановите qt строго по инструкции) по-моему многие забывают про системные переменные
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #7 : Октябрь 06, 2010, 16:40 »

Было подобное с чужой DLL, откомпилированной в MSVC когда ее подключал к своей программе на... MSVC. Всё дело было в неправильно указанном соглашении о вызовах в описании импортируемой из DLL функции (stdcall вместо cdelc или наоборот - не помню). Причем под debug все работало, а вот в release - нет. Самое смешное, что под mingw все работало хорошо и так и эдак.
Записан
crossly
Гость
« Ответ #8 : Октябрь 06, 2010, 16:46 »

потому что плюшек вроде cdelc в gcc нету...
Записан
erinyes
Гость
« Ответ #9 : Май 23, 2012, 17:15 »

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

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

Можно ли как-нибудь это исправить? И, если можно, поподробнее объяснить в чем засада?
Да, компилятор mingw как раз.
Записан
Странник
Гость
« Ответ #10 : Май 24, 2012, 00:54 »

у меня кстати тоже аномалия какая-то проявилась. использую mingw, и в релизе, и в дебаге одна и та же история. при наличии отладочных выводов qDebug() все прекрасно работает, стоит закомментировать хоть один - падает с ошибкой сегментации.
Записан
erinyes
Гость
« Ответ #11 : Май 24, 2012, 11:19 »

В общем, как я и предполагал проблема оказалась в руках Улыбающийся
Дело в том, что при объявлении функций в хедере библиотеки используется макрос WINAPI. Увидев нечто вроде
#define WINAPI FAR PASCAL
я подумал "wtf?" и опустил это дело при определении указателей на функции, хотя подозрение было что не заработает. Погуглив, сегодня по поводу этого WINAPI, добавил __stdcall в описание и все заработало. Смутило опять же то, что в дебаге все было нормально.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 23.