2010-10-20 3 views
2

J'ai écrit un programme Open Source que j'ai publié en tant que GPL construit à l'aide du kit de développement logiciel Qt4 LGPL. Ce programme a la capacité de rechercher une base de données Sqlite3 optionnelle pour les données.Le programme Qt4 se bloque à moins que le SDK ne soit installé

Voici ce qui me fait perdre la tête. Je compile le programme sur la machine de développement. Lorsque j'essaie de l'exécuter, je peux avoir des erreurs sur les DLL manquantes. Je copie ces dlls dans le même répertoire que l'exécutable et il fonctionne maintenant bien (mingwm10.dll, libgcc_s_dw2-1.dll, QtCore4.dll, QtSql4.dll, QtGui4.dll), y compris la recherche de base de données.

Maintenant, si je copie ce dossier avec l'exécutable et les DLL sur une nouvelle machine sur laquelle le SDK n'est pas installé, il fonctionne correctement jusqu'à ce que j'essaie de chercher. Dès que je clique sur le bouton de recherche, je peux l'erreur suivante:

Title: Microsoft Visual C++ Runtime Library 
Runtime Error! 
This application has requested the Runtime to terminate it in an unusual way. 
Please contact the application's support team for more information. 

Je puis télécharger et installer le SDK, ne rien faire d'autre, je peux maintenant exécuter le programme et rechercher le fichier sqlite3 très bien!

Quelle magie manque-t-il?

P.S. Les deux machines sont des systèmes Windows XP fraîchement installés.

Répondre

2

Vous pouvez avoir des bibliothèques ou des plug-ins Qt qui ne sont pas déployés sur la machine cible. C'est probablement le plugin de pilote SQL. Voici quelques informations à ce sujet: http://doc.trolltech.com/latest/deployment-windows.html#qt-plugins

Vous aurez besoin de copier les plugins Qt nécessaires dans un répertoire à côté de votre exécutable. Et d'ajouter quelque chose comme ça dans votre main():

QApplication::addLibraryPath(QCoreApplication::applicationDirPath() + "/plugins"); 

(lien Edité et ajouté le code)

+0

Et vous avez besoin http://www.dependencywalker.com/ –

+0

Je pense que vous avez touché à ce sujet ici. Le plugin dont j'ai besoin est qsqlite4.dll. Comment diable puis-je l'utiliser? Dois-je ajouter du code à mon programme pour le charger explicitement? J'ai joué avec le mettre dans différents endroits et en ajoutant un fichier qt.conf pendant plus d'une heure sans chance. – Kyle

+0

@Kyle: J'ai édité ma réponse à ce que je pense fonctionnera. –

0

J'ai trouvé le problème.

Stephen Chu avait raison de me dire que le pilote sqlite me manquait. Cependant, je peux dans plus de complications en cours de route.

Le SDK est livré avec deux jeux de DLL. Un ensemble réside dans $ BASEDIR/bin et l'autre dans $ BASEDIR/qt/bin. Le premier contient les DLL utilisées par Qt Creator, tandis que les dernières sont les DLL que vous voulez envoyer avec votre exécutable.

Je devais prendre le plugin sqlite (qsqlite4.dll) et le copier dans APP_DIR/sqlplugins. Mon problème était que j'utilisais le mauvais fichier qsqlite4.dll.

Un grand merci à tous ceux qui ont contribué à cette question.

Pour référence ultérieure, cette question a également été abordée ici: http://www.qtforum.org/article/34639/qt4-program-crashing-unless-sdk-installed.html

+0

Juste résolu ce problème. La version du plugin 'qsqlite4.dll' était le problème. Il ** ne doit pas ** être supérieur aux bibliothèques Qt que vous utilisez (voir la documentation de [qt] (http://qt-project.org/doc/qt-4.8/deployment-plugins.html#loading-and- vérification-plugins-dynamiquement): _Qt 4.3.0 ne chargera pas un plugin construit avec Qt 4.3.1_). La structure de répertoire qui a fonctionné pour nous était 'APPDIR/sqldrivers/qsqlite4.dll'. –

Questions connexes