Bonsoir,
Pour mon IDE en cours de développement, j'ai eu à m'occuper d'une partie concernant la compilation avec des QProcess pour appeler qmake et mingw32-make (ou make pour Mac et Linux).
Je me suis toutefois heurté à un problème qui était de retrouver l'emplacement de l'exécutable après la compilation pour pouvoir le lancer.
Jusqu'alors, je passais par le Makefile en utilisant une QRegExp comme le montre le code qui suit :
Toutefois, une opération telle que voici n'est pas très optimisée et je pense qu'il existe une alternative.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 void FenPrincipale::runProj() { #if defined(Q_WS_WIN) QFile f(QFileInfo(projet.pathToProjFile).dir().path() + "/Makefile." + projet.compilMode); #elif defined(Q_WS_X11) QFile f(QFileInfo(projet.pathToProjFile).dir().path() + "/Makefile"); #else QFile f(QFileInfo(projet.pathToProjFile).dir().path() + "/Makefile"); #endif if(!f.exists() || !f.open(QIODevice::ReadOnly | QIODevice::Text)) return; QStringList tmp = QString(f.readAll()).split("\n"); f.close(); #if defined(Q_WS_WIN) QRegExp regexp("DESTDIR_TARGET = \"[^\n](.*)\""); #elif defined(Q_WS_X11) QRegExp regexp("TARGET(\\s*)= (\"?)[^\n](.*)(\"?)"); #else QRegExp regexp("TARGET(\\s*)= (\"?)[^\n](.*)(\"?)"); #endif if(tmp.indexOf(regexp) == -1) { QMessageBox::critical(this, "Erreur", "Impossible de lancer l'application."); return; } QString line = tmp[tmp.indexOf(regexp)]; QStringList prepath = line.split(QRegExp(" = (\"?)")); QString path = QFileInfo(projet.pathToProjFile).dir().path() + "/" + prepath[1]; if(path.right(1) == "\"") path.chop(1); path.replace("/", "\\"); QProcess *p = new QProcess(this); p->setWorkingDirectory(pathQt); p->startDetached(path, QProcess::systemEnvironment(), ""); }
Bref, je m'en remets à vous pour optimiser ce code ou bien pour m'aider à trouver une autre solution qui puisse, comme le titre l'indique, retrouver l'application générée.
Merci d'avance,
Amnell.
Partager