我有一个静态版本的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? 如果我拿出任何一个并编译,我最终得到了未定义的引用链接错误。
我想知道如何找出正确的订单!谢谢!
答案 0 :(得分:1)
通过反复试验,大多数......理论上你可以用nm
从库中提取外部引用(所有符号在第二列中都带有'U'或'u'),然后在其他库中搜索这些符号,并将它们放在链接顺序中的第一个库后面。但这比它的价值还要多。未定义的引用应该为您提供关于所需库的良好提示。
双Qt5Gui可能是因为库之间存在循环引用(即libA需要来自libB的函数,而libB引用来自libA的函数)。添加两次没有害处;链接器非常智能,只能包含它真正需要的功能。