Bonjour,
J'utilise QtCreator 4.2.1 avec compil compil MinGW4.9.2 32 bit (plateforme Win 8.1).
Mon projet "pgi" comporte uniquement un main.cpp qui appelle 2 bibliothèques statiques persos et 1 bibliothèque de templates "eigen3" (uniquement des entêtes); voici le pgi.pro:
La bibli Mathlib2 comporte uniquement 1 mathlib2.h et 1 mathlib2.cpp , compilée en mode release.
Code qt-pro : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 QT += core QT -= gui CONFIG += c++11 TARGET = pgi CONFIG += console CONFIG -= app_bundle TEMPLATE = app LIBS += d:/Qt-apps/build-Mathlib2-Desktop_Qt_5_5_1_MinGW_32bit-Release/release/libMathlib2.a \ d:/Qt-apps/build-PhygenicLib-Desktop_Qt_5_5_1_MinGW_32bit-Debug/debug/libPhygenicLib.a INCLUDEPATH += d:/Qt-apps/PhygenicLib \ d:/Qt-apps/Mathlib2 \ d:/Qt-apps/eigen3 SOURCES += main.cpp HEADERS += DEFINES += QT_DEPRECATED_WARNINGS
La bibli PhygenicLib comporte n fichiers d'entête +n sources et fait appel aux biblis Mathlib2 (statique) et eigen3 (entêtes), compilée en mode debug.
Voici mon main() qui ne veut pas linker:
L'include "Anasyntax.h" tire tous les entêtes nécessaires et suffisants pour l'ensemble des 3 bibliothèques (racine de l'arbre des entêtes).
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 #include <iostream> include "Anasyntax.h" using namespace std; ofstream fdmp("test_pgi.txt"); ostringstream oss ; // ============== int main(int, char**) { try { // bloc try string msg_log= OK ; Anasyntax asynt ; asynt.interprete(fdmp); } catch (std::exception const& err) { fdmp << err.what()<< endl<<" - Erreur fatale." << endl ; cerr << err.what()<< endl<<"- Erreur fatale." << endl ; } cout<<'\a' ; // sonnette de fin fdmp << "--- FIN DE L'EXECUTION --- "<< std::endl; fdmp.close() ; return EXIT_SUCCESS ; }
Extrait du résultat compil:
Apparemment, make ne trouve pas les liens vers les fonctions de la bibli Mathlib2 dont il a besoin pour les fonctions appelées dans la bibli PhygenicLib; alors que ces liens devraient déjà être résolus à l'intérieur de libPhygenicLib.a (non?)19:39:24: Exécution des étapes pour le projet pgi...
19:39:24: Débute : "C:\Qt\Tools\mingw492_32\bin\mingw32-make.exe" clean
C:\Qt\5.5\mingw492_32\bin\qmake.exe -spec win32-g++ "CONFIG+=debug" "CONFIG+=qml_debug" -o Makefile ..\pgi\pgi.pro
C:/Qt/Tools/mingw492_32/bin/mingw32-make -f Makefile.Debug clean
mingw32-make[1]: Entering directory 'D:/Qt-apps/build-pgi-Desktop_Qt_5_5_1_MinGW_32bit-Debug'
del debug\main.o
mingw32-make[1]: Leaving directory 'D:/Qt-apps/build-pgi-Desktop_Qt_5_5_1_MinGW_32bit-Debug'
C:/Qt/Tools/mingw492_32/bin/mingw32-make -f Makefile.Release clean
mingw32-make[1]: Entering directory 'D:/Qt-apps/build-pgi-Desktop_Qt_5_5_1_MinGW_32bit-Debug'
del release\main.o
Impossible de trouver D:\Qt-apps\build-pgi-Desktop_Qt_5_5_1_MinGW_32bit-Debug\release\main.o
mingw32-make[1]: Leaving directory 'D:/Qt-apps/build-pgi-Desktop_Qt_5_5_1_MinGW_32bit-Debug'
19:39:25: Le processus "C:\Qt\Tools\mingw492_32\bin\mingw32-make.exe" s'est terminé normalement.
19:39:25: Configuration inchangée, étape qmake sautée.
19:39:25: Débute : "C:\Qt\Tools\mingw492_32\bin\mingw32-make.exe"
C:/Qt/Tools/mingw492_32/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory 'D:/Qt-apps/build-pgi-Desktop_Qt_5_5_1_MinGW_32bit-Debug'
g++ -c -pipe -fno-keep-inline-dllexport -g -std=c++0x -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_CORE_LIB -I..\pgi -I. -Id:\Qt-apps\PhygenicLib -Id:\Qt-apps\Mathlib2 -Id:\Qt-apps\eigen3 -IC:\Qt\5.5\mingw492_32\include -IC:\Qt\5.5\mingw492_32\include\QtCore -Idebug -IC:\Qt\5.5\mingw492_32\mkspecs\win32-g++ -o debug\main.o ..\pgi\main.cpp
g++ -Wl,-subsystem,console -mthreads -o debug\pgi.exe debug/main.o d:/Qt-apps/build-Mathlib2-Desktop_Qt_5_5_1_MinGW_32bit-Release/release/libMathlib2.a d:/Qt-apps/build-PhygenicLib-Desktop_Qt_5_5_1_MinGW_32bit-Debug/debug/libPhygenicLib.a -LC:/Qt/5.5/mingw492_32/lib -lQt5Cored
d:/Qt-apps/build-PhygenicLib-Desktop_Qt_5_5_1_MinGW_32bit-Debug/debug/libPhygenicLib.a(mecagen.o): In function `ZN10Solide_dyn4calcEv':
D:\Qt-apps\build-PhygenicLib-Desktop_Qt_5_5_1_MinGW_32bit-Debug/../PhygenicLib/mecagen.cpp:220: undefined reference to `rotation_WM(V3)'
D:\Qt-apps\build-PhygenicLib-Desktop_Qt_5_5_1_MinGW_32bit-Debug/../PhygenicLib/mecagen.cpp:221: undefined reference to `Mat_transp_3x3(Mat3x3)'
J'ai une parade qui fonctionne nickel: il suffit d'insérer au début du main() un appel à une fonction quelconque de la bibli Mathlib2, par exemple:
et alors tout compile sans aucun warning et s'exécute comme prévu. Cela m'énerve pas mal de ne pas comprendre pourquoi cela ne fonctionne pas sans une telle instruction bidon... Il faut avouer que je n'ai jamais trop cherché à savoir ce que c'est qu'un make
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 int main(int, char**) { coupure(0.,0.,0.) ; // appel nécessaire (pourquoi?) à n'importe quelle fonction définie dans mathlib2.cpp try { // bloc try string msg_log= OK ; // etc..., c'est tellement plus facile d'appuyer sur les boutons magiques de QtCreator..."It MAKEs me cry!" comment chantaient les Beatles
Partager