将C ++静态库与QtCreator链接

时间:2018-08-27 14:12:43

标签: linker qt-creator static-libraries

我正在将QtCreator 4.2.1与MinGW4.9.2 32位编译器(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 会在需要时从各种库中提取所有头文件(可以说是include树的根)。 现在,当我尝试编译和链接项目时,得到以下诊断信息(抱歉,法语安装的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 :(得分:0)

我再次阅读了一些具有类似问题的帖子,并发现了有关声明静态库的顺序的评论,这在某些情况下可能很关键。 实际上,如果我以相反的顺序在 pgi.pro 中声明LIBS,则如下所示:

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

然后,该项目可以编译和链接,而无需在 main.cpp 中对Mathlib2对象或函数的任何引用。我上了课,现在将按照适当的顺序声明LIBS ...