Qt5 在Linux 下的编译,该怎么处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt5 在Linux 下的编译,该怎么处理相关的知识,希望对你有一定的参考价值。

[wanglj@localhost testQT]$ make
g++ -o testQT main.o -L/opt/Qt5.1.1/5.1.1/gcc_64/lib -lqt-mt -lXext -lX11 -lm
main.o: In function `main':
/home/wanglj/testQT/main.cpp:6: undefined reference to `QApplication::QApplication(int&, char**, int)'
main.o: In function `QString':
/usr/include/QtCore/qstring.h:413: undefined reference to `QString::fromAscii_helper(char const*, int)'
main.o: In function `main':
/home/wanglj/testQT/main.cpp:7: undefined reference to `QLabel::QLabel(QString const&, QWidget*, QFlags<Qt::WindowType>)'
main.o: In function `~QString':
/usr/include/QtCore/qstring.h:869: undefined reference to `QString::free(QString::Data*)'
/usr/include/QtCore/qstring.h:869: undefined reference to `QString::free(QString::Data*)'
collect2: ld 返回 1
make: *** [testQT] 错误 1

但若直接用 qtcreator 打开编译,则无错误
并且find -name libqt-mt* 也找不到其他版本的该文件

用qtcreator编译好的可执行文件,也找不到连接该lib文件

[wanglj@localhost build-testQT-桌面-Debug]$ ldd testQT
linux-vdso.so.1 => (0x00007fff4ddff000)
libQtGui.so.4 => /usr/lib64/libQtGui.so.4 (0x000000397f000000)
libQtCore.so.4 => /usr/lib64/libQtCore.so.4 (0x000000397ea00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003978600000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fda6a081000)
libm.so.6 => /lib64/libm.so.6 (0x0000003977a00000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003983a00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003977e00000)
libgthread-2.0.so.0 => /lib64/libgthread-2.0.so.0 (0x000000397a600000)
librt.so.1 => /lib64/librt.so.1 (0x0000003978e00000)
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x0000003979200000)
libpng12.so.0 => /usr/lib64/libpng12.so.0 (0x000000397be00000)
libz.so.1 => /lib64/libz.so.1 (0x0000003978a00000)
libfreetype.so.6 => /usr/lib64/libfreetype.so.6 (0x000000397ba00000)
libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x0000003979e00000)
libSM.so.6 => /usr/lib64/libSM.so.6 (0x0000003985a00000)
libICE.so.6 => /usr/lib64/libICE.so.6 (0x0000003984e00000)
libXi.so.6 => /usr/lib64/libXi.so.6 (0x000000397ce00000)
libXrender.so.1 => /usr/lib64/libXrender.so.1 (0x000000397d600000)
libXrandr.so.2 => /usr/lib64/libXrandr.so.2 (0x000000397de00000)
libXfixes.so.3 => /usr/lib64/libXfixes.so.3 (0x000000397da00000)
libXcursor.so.1 => /usr/lib64/libXcursor.so.1 (0x000000397e200000)
libXinerama.so.1 => /usr/lib64/libXinerama.so.1 (0x000000397e600000)
libfontconfig.so.1 => /usr/lib64/libfontconfig.so.1 (0x000000397d200000)
libXext.so.6 => /usr/lib64/libXext.so.6 (0x000000397c600000)
libX11.so.6 => /usr/lib64/libX11.so.6 (0x000000397b600000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003978200000)
/lib64/ld-linux-x86-64.so.2 (0x0000003977600000)
libuuid.so.1 => /lib64/libuuid.so.1 (0x0000003983600000)
libexpat.so.1 => /lib64/libexpat.so.1 (0x000000397c200000)
libxcb.so.1 => /usr/lib64/libxcb.so.1 (0x000000397ae00000)
libXau.so.6 => /usr/lib64/libXau.so.6 (0x000000397aa00000)

------解决方案--------------------
INCPATH = -I/usr/lib64/qt-3.3/mkspecs/default -I. -I. -I$(QTDIR)/include
这一行看上去你调用的qmake不是5.1.1的。试试指定完整路径运行qmake
/opt/Qt5.1.1/5.1.1/gcc_64/bin/qmake testQT.pro
参考技术A 参考https://wiki.qt.io/Install_Qt_5_on_Ubuntu
获得信息源:
$ git clone https://code.qt.io/qt/qt5.git
$ cd qt5
$ git checkout 5.10.1 #In order to build a specific release of Qt
$ perl init-repository
配置:
$ mkdir ~/qt-build
$ cd ~/qt-build
$ ~/qt-source/configure -prefix /opt/Qt5 -developer-build -opensource -nomake examples -nomake tests #Configuring with the -prefix option means that the Qt binaries and libraries are installed into another directory, which is /opt/Qt5 in this case.
$ qmake
生成:
$ make
$ make install

QT中能不能调用C语言的API。linux下的

我看完了“unix环境高级编程”,现在要学QT了,QT中能调用里面的API吗???
如fork, waitpid, exec, thread_create, socket, connect, accept,之类的。
平常用QT做软件的时候会调用到C语言的API吗???如果用的话,用的多吗???
还有就是"unix环境高级程序"这样的书,讲C的API的,我是看完了,在哪些工程中会用到这些东西

QT如果是C++版就能够调用C语言的函数,只要你用了相应的库包函。你说调用fork, waitpid, exec, thread_create, socket, connect, accept这些函数不知道每个函数的意思是什么.但是,在QT里这些函数应该在QT里已经都有了的,至少我看到你说的exec,socket,connect,accept这些函数我都用了的,但是不知道你说的fork,waitpid,thread_create是什么函数,thread_create如果是建立线程的话,在QT里创建线程更简单。QT里面很少用到C的基本函数,因为QT的功能本身就比较强大,但是QT不是面向过程的集成开发环境,它是面向对象的,如果你只学了C的话,最好再学学C++吧。只有学了C++才能更好的学,不然你学起来非常痛苦,相反如果学了C++就轻松得多,至少比VC++更轻松。追问

我C++的基本语法学过,还学了很久,所以不怕。
那些函数都是 "unix环境高级编程"还有"unix网络编程里面"的

追答

QT它就有网络编程,而且学QT的网络也比较简单。反正我觉得学QT比学VC++不知道要简单多少!你买一本《C++ GUI Qt 4编程(第二版)》吧,这本书对学QT的人来相当好,你也可以到国内的QT网站去看一下。国内比较出名的就是qtcn.org(叫QTCN社区)

追问

那这么说的话,linux下的C不就基本没用了,图形界面又不用它,内核驱动也用不到它???

追答

这个我就不知道了。我只听说linux的内核一般是由C和汇编写的,一般的用户程序是用C++和JAVA等面向对象的语言写的.至于你说的图形界面好象可以用C写,我记得以前在图书馆看到过一般书介绍用C写图形界面,好象比较麻烦。

参考技术A 可以调用哈。
一般用的比较少了,因为QT在系统函数的基础上又封装了一次。

unix环境高级程序里讲的一般用于系统编程。
参考技术B 当然能。QT在linux里的实现就是靠的这些啊。linux c都能在qt中用呢。 参考技术C QT是跨平台的,看你要在哪个平台上面用,一般如果在LINUX类似平台上是可以使用的。

以上是关于Qt5 在Linux 下的编译,该怎么处理的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu下的Qt5安装

linux 批处理

Qt5 Linux 找不到 Qt 库

Qt5 QProcess 处理带有“特殊”字符的参数

CentOS7.9发布Qt5.12.编译的程序

是否可以使用 Qt5 处理硬链接?