Связывание статических библиотек C ++ с QtCreator - PullRequest
0 голосов
/ 27 августа 2018

Я использую QtCreator 4.2.1 с 32-битным компилятором MinGW4.9.2 (платформа Win 8.1). Мой проект pgi содержит только main.cpp , который использует объекты и функции, принадлежащие моей статической библиотеке PhygenicLib . Эта статическая библиотека, в свою очередь, опирается на функции, классы и константы, определенные в статической библиотеке Mathlib2 вместе с библиотекой шаблонов eigen3 (на основе шаблона, только заголовки, нет .cpp!) в сети. Вот файл PhygenicLib.pro , который прекрасно компилируется в файл libPhygenicLib.a (режим отладки):

QT       -= gui
TARGET = PhygenicLib
TEMPLATE = lib
CONFIG += staticlib
DEFINES += QT_DEPRECATED_WARNINGS
INCLUDEPATH += d:/Qt-apps/Mathlib2 d:/Qt-apps/eigen3
SOURCES += phygenic.cpp \ cinemeca_pg.cpp \ mecagen.cpp \ 
    rc_perf_pg.cpp \ xploit_pg.cpp \ utilities.cpp \
    Analex.cpp \ Anasyntax.cpp 
HEADERS += phygenic.h \ cinemeca_pg.h \ mecagen.h \ rc_perf_pg.h \
    xploit_pg.h \ utilities.h \ Analex.h \ Anasyntax.h
unix { target.path = /usr/lib
INSTALLS += target }

Вот pgi.pro (режим отладки):

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

Обратите внимание, что Mathlib2 скомпилирован в режиме выпуска, а не в режиме отладки, но это не должно быть проблемой (?). Теперь, вот мой main.cpp :

#include <iostream>
#include "Anasyntax.h"
using namespace std;
int main(int, char**)
{
    ofstream fdmp("test"+extFichier[DMP]);
    try { // bloc try
        fdmp<<"--- test généraux interpréteur ---"<<endl ;
         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' ; 
    fdmp << "--- FIN DE L'EXECUTION --- "<< std::endl;
    fdmp.close() ;
    return EXIT_SUCCESS ;
}

# include Anasyntax.h извлекает все заголовки из различных библиотек, где это необходимо (корень дерева включения, так сказать). Теперь, когда я пытаюсь скомпилировать и связать проект, я получаю следующую диагностику (извините, язык, установленный на французском языке QtCreator):

14:48:12: Exécution des étapes pour le projet pgi...
14:48:12: Débute : "C:\Qt\Tools\mingw492_32\bin\mingw32-make.exe" clean
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
Impossible de trouver D:\Qt-apps\build-pgi-Desktop_Qt_5_5_1_MinGW_32bit-Debug\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'
14:48:13: Le processus "C:\Qt\Tools\mingw492_32\bin\mingw32-make.exe" s'est terminé normalement.
14:48:13: Configuration inchangée, étape qmake sautée.
14:48:13: 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)'
and so on, and so on...

Похоже, g ++ пытается связать mecagen.cpp (который уже скомпилирован как часть libPhygenicLib.a) и не находит ссылок на символы, которые являются частью библиотеки Mathlib2 (includepath = d: / Qt-apps / Mathlib2, LIB = d: /.../ release / libMathlib2.a). Я нашел решение для обхода: просто вставив в main.cpp ссылку на любой объект или функцию Mathlib2, например, функцию coupure в дальнейшем, можно создать и запустить исполняемый файл проекта. без предупреждения / ошибки:

int main(int, char**)
{
    ofstream fdmp("test"+extFichier[DMP]);
    coupure(0.,0.,0.) ; // any object or function from Mathlib2 works as well!
    try { // etc...

Так что проблема решена, но это сводит меня с ума от того, что я не понимаю, почему это не сработает без вставки бесполезной строки кода ... Я должен сказать, что мне было лень когда-либо узнавать о g ++, make, qmake и makeFile такие вещи; просто нажимать кнопки QtCreator так легко и удобно ...

1 Ответ

0 голосов
/ 28 августа 2018

Я снова прочитал несколько постов с похожими проблемами и нашел один комментарий, касающийся порядка объявления статических библиотек, которые в некоторых случаях могут быть критическими. И действительно, если я объявил LIBS в моем pgi.pro в обратном порядке, как показано ниже:

LIBS += d:/Qt-apps/build-PhygenicLib-Desktop_Qt_5_5_1_MinGW_32bit-Debug/debug/libPhygenicLib.a \
    d:/Qt-apps/build-Mathlib2-Desktop_Qt_5_5_1_MinGW_32bit-Release/release/libMathlib2.a

Затем проект хорошо компилируется и связывается без какой-либо посторонней ссылки на объект или функцию Mathlib2 в main.cpp . Я получил урок и теперь позабочусь об объявлении LIBS в соответствующем порядке ...

...