我刚刚在我的系统上安装了Qt5(linux mint petra),安装了qt5-default软件包。 我有一个简单的.ui文件和一个main.cpp。 使用uic,我可以将.ui文件转换为.h文件,该文件包含在main.cpp中。直到现在都没问题。
我运行qmake -project,qmake和make。 编译很好,我得到main.o. 但链接给了我一堆“未定义的引用......”。
所以,我检查了库。 这是链接器调用:
g++ -m64 -Wl,-O1 -o qttest main.o -L/usr/X11R6/lib64 -lQt5Gui -L/usr/lib/x86_64-linux-gnu -lQt5Core -lGL -lpthread
好的,所以我搜索了这些库。 据我所知,参数-lQt5Core强制链接器在使用-L选项指定的目录中查找名为libQt5Core.a的文件。 但是,此文件夹仅包含libQt5core.so。与其他所需库相同。 据我所知,.a文件用于静态链接,而.so用于动态链接。
现在,我该怎么办?我应该在互联网上搜索.a库吗? 为什么qmake会生成一个尝试静态链接的makefile? 我错过了一些包吗? 我没有动态链接。我是否必须添加用于加载.so的代码? 作为第一步,我感觉静态链接更容易。
最好的问候
答案 0 :(得分:2)
使用uic,我可以将.ui文件翻译成.h文件
不,你应该让你的构建系统做到这一点。即使用FORMS
文件中的.pro
变量。或者您是否愿意每次触摸.ui
时手动重新运行?
据我所知,参数-lQt5Core强制链接器在使用-L选项指定的目录中查找名为libQt5Core.a的文件。但是,此文件夹仅包含libQt5core.so。与其他所需库相同。据我所知,.a文件用于静态链接,而.so用于动态链接。
这只是故事的一半。在支持共享库(即所有现代系统)的系统上,GNU ld将首先查找共享库(即.so
),并且只有在找不到共享库时才会查找静态库( .a
)。
无论如何,这不是你的问题。您的问题是您正在使用.ui
文件,即小部件,并且您没有告诉qmake您想要QtWidgets库,因为链接器的命令行中没有-lQtWidgets
。
解决方案:添加
QT += widgets
到您的.pro文件,重新运行qmake,make,就是这样。