链接到静态QT,如何找到正确的链接顺序?

时间:2016-04-08 10:50:24

标签: c++ qt cmake

我有一个静态版本的QT编译如下:

@echo off

SET QTDIR=%~dp0%
SET QMAKESPEC=win32-g++
SET PATH=%PATH%;%QTDIR%/gcc

call configure -release -nomake examples -nomake tools -static -static-runtime -opensource -confirm-license -platform win32-g++ -ltcg -c++std c++11 -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -fontconfig -qt-harfbuzz -qt-sql-sqlite -prefix %QTDIR%/gcc

mingw32-make -j4
mingw32-make install

我有一个示例程序如下:

#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtCore/QtPlugin>
Q_IMPORT_PLUGIN (QWindowsIntegrationPlugin);

int main(int argc, char** argv){

    QApplication app(argc, argv);
    QMainWindow w;

    w.resize(600,600);
    w.show();
    app.exec();

    return 0;
}

现在当我尝试使用cmake编译它时:

ADD_EXECUTABLE( ${PROJECT_NAME} WIN32 "main.cpp")
TARGET_LINK_LIBRARIES(${PROJECT_NAME} Qt5Widgets qwindows Qt5Gui Qt5Core qtmain Qt5Gui Qt5OpenGL Qt5OpenGLExtensions Qt5PlatformSupport qtfreetype dxguid d3d9 d3dx9 imm32 winmm Qt5WinExtras libEGL ws2_32 translator qtpcre libGLESv2 qtharfbuzzng preprocessor )

有效!但请注意在行尾的重复Qt5Gui? 如果我拿出任何一个并编译,我最终得到了未定义的引用链接错误。

我想知道如何找出正确的订单!谢谢!

1 个答案:

答案 0 :(得分:1)

通过反复试验,大多数......理论上你可以用nm从库中提取外部引用(所有符号在第二列中都带有'U'或'u'),然后在其他库中搜索这些符号,并将它们放在链接顺序中的第一个库后面。但这比它的价值还要多。未定义的引用应该为您提供关于所需库的良好提示。

双Qt5Gui可能是因为库之间存在循环引用(即libA需要来自libB的函数,而libB引用来自libA的函数)。添加两次没有害处;链接器非常智能,只能包含它真正需要的功能。