很久没用Qt了,这次要做一个协议编辑器,在ubuntu 14.04上安装了最新版本的Qt 5.7.0。界面改用扁平化风格,第一感觉还不错。按默认步骤创建了一个gui程序,编译运行,报了一个错:cannot find -lGL。

  作为一个用惯了makefile的程序员,知道是少了库文件,而且名字应该为libGL.a或者libGL.so。到网上搜索一下,发现GL是openGL的缩写,显然是缺少openGL的开发库。安装命令为:sudo apt-get install libgl1-mesa-dev。在网上搜索关键字"cannot find -lGL",得到的答案就是安装开发库。

  openGL是一个巨大的库,而我只是做个编辑器而已,又不是什么2D、3D的程序,明显用不到openGL的。于是我到stackoverflow搜索了一下,找到了答案:http://stackoverflow.com/questions/18406369/qt-cant-find-lgl-error

you don't need to install anything. libGL is already installed with Ubuntu, you just need to soft link it. (works for ubuntu 14.x and 15.x)

.First locate the GL library
.Then link it under /usr/lib
.If the library is missing, it can be installed via libgl1-mesa-dev package
Here is how you could do this: $ locate libGL
/usr/lib/i386-linux-gnu/mesa/libGL.so.
/usr/lib/i386-linux-gnu/mesa/libGL.so.1.2.
/usr/lib/x86_64-linux-gnu/libGLEW.so.1.10
/usr/lib/x86_64-linux-gnu/libGLEW.so.1.10.
/usr/lib/x86_64-linux-gnu/libGLEWmx.so.1.10
/usr/lib/x86_64-linux-gnu/libGLEWmx.so.1.10.
/usr/lib/x86_64-linux-gnu/libGLU.so.
/usr/lib/x86_64-linux-gnu/libGLU.so.1.3.
/usr/lib/x86_64-linux-gnu/mesa/libGL.so.
/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.
/usr/lib/x86_64-linux-gnu/mesa-egl/libGLESv2.so.
/usr/lib/x86_64-linux-gnu/mesa-egl/libGLESv2.so.2.0.
$ sudo ln -s /usr/lib/x86_64-linux-gnu/mesa/libGL.so. /usr/lib/libGL.so

我的系统确实存在libGL.so.1.2.0这个文件。按他的方法解决了问题。如果你的系统确实没这个文件,那真是要安装了。

  程序能跑起来了,不过并没有解决我的疑问:Qt的gui真的需要依赖openGL么?搜索官方的文档,找到了答案:http://doc.qt.io/qt-5/linux-requirements.html

在Qt for X11 Requirements的列表里,并没有openGL。在OpenGL Dependencies里,也指明在Qt使用openGL需要#include <QtOpenGL>并且需要在.pro项目配置文件里加上Qt += opengl。这说明我的程序根本不依赖openGL,决定手动测试一下。

  清理项目,重新编译一次,然后切换到编译输出:

可以看到编译的参数,我手动进入到对应的目录,然后改一下编译参数:

xzc@xzc-HP-ProBook-4446s:~/Documents/code/build-SPEditor-Desktop_Qt_5_7_0_GCC_64bit-Debug$ rm SPEditor
xzc@xzc-HP-ProBook-4446s:~/Documents/code/build-SPEditor-Desktop_Qt_5_7_0_GCC_64bit-Debug$ g++ -Wl,-rpath,/opt/Qt5.7.0/5.7/gcc_64/lib -o SPEditor main.o mainwindow.o moc_mainwindow.o -L/opt/Qt5.7.0/5.7/gcc_64/lib -lQt5Widgets -L/usr/lib64 -lQt5Gui -lQt5Core -lpthread
xzc@xzc-HP-ProBook-4446s:~/Documents/code/build-SPEditor-Desktop_Qt_5_7_0_GCC_64bit-Debug$ ./SPEditor
xzc@xzc-HP-ProBook-4446s:~/Documents/code/build-SPEditor-Desktop_Qt_5_7_0_GCC_64bit-Debug$

不使用-lGL参数编译链接的程序,也可以正常跑,验证了我的想法。

  既然不依赖openGL,为什么要链接openGL呢?首先在链接参数里加额外-lGL对生成的程序并没有影响,你的程序里没有调用openGL的方法,不会有任何额外的代码链接进去。而Qt是一个跨平台的库,里面包含一些3D的库。要Qt Creator非常智能地根据程序生成依赖,这个有点难,也没必要。所以我觉得作者干脆把这些常用的库都加到链接参数里,一了百了。

  这些预先定好的参数,按平台放在安装目录的mkspecs目录的,比如我的就在opt/Qt5.7.0/5.7/gcc_64/mkspecs。存细看链接参数,你会发现

-I/opt/Qt5.7.0/5.7/gcc_64/mkspecs/linux-g++这要的路径,这是Qt的跨平台配置。我的机子上,在

/opt/Qt5.7.0/5.7/gcc_64/mkspecs/common/linux.conf可以找到这样的配置

#
# qmake configuration for common linux
# QMAKE_PLATFORM += linux include(unix.conf) QMAKE_CFLAGS_THREAD += -D_REENTRANT
QMAKE_CXXFLAGS_THREAD += $$QMAKE_CFLAGS_THREAD
QMAKE_LFLAGS_GCSECTIONS = -Wl,--gc-sections QMAKE_LFLAGS_REL_RPATH = -Wl,-z,origin
QMAKE_REL_RPATH_BASE = $ORIGIN QMAKE_INCDIR =
QMAKE_LIBDIR =
QMAKE_INCDIR_X11 =
QMAKE_LIBDIR_X11 =
QMAKE_INCDIR_OPENGL =
QMAKE_LIBDIR_OPENGL =
QMAKE_INCDIR_OPENGL_ES2 = $$QMAKE_INCDIR_OPENGL
QMAKE_LIBDIR_OPENGL_ES2 = $$QMAKE_LIBDIR_OPENGL
QMAKE_INCDIR_EGL =
QMAKE_LIBDIR_EGL =
QMAKE_INCDIR_OPENVG =
QMAKE_LIBDIR_OPENVG = QMAKE_LIBS =
QMAKE_LIBS_DYNLOAD = -ldl
QMAKE_LIBS_X11 = -lXext -lX11 -lm
QMAKE_LIBS_NIS = -lnsl
QMAKE_LIBS_EGL = -lEGL
QMAKE_LIBS_OPENGL = -lGL
QMAKE_LIBS_OPENGL_ES2 = -lGLESv2
QMAKE_LIBS_OPENVG = -lOpenVG
QMAKE_LIBS_THREAD = -lpthread
QMAKE_LIBS_LIBUDEV = -ludev QMAKE_CFLAGS_WAYLAND =
QMAKE_INCDIR_WAYLAND =
QMAKE_LIBS_WAYLAND_CLIENT = -lwayland-client
QMAKE_LIBS_WAYLAND_SERVER = -lwayland-server
QMAKE_LIBDIR_WAYLAND =
QMAKE_DEFINES_WAYLAND =
QMAKE_WAYLAND_SCANNER = wayland-scanner QMAKE_CFLAGS_XCB =
QMAKE_LIBS_XCB =
QMAKE_DEFINES_XCB = QMAKE_AR = ar cqs
QMAKE_OBJCOPY = objcopy
QMAKE_NM = nm -P
QMAKE_RANLIB = QMAKE_STRIP = strip
QMAKE_STRIPFLAGS_LIB += --strip-unneeded

如果你的程序确实用不着openGL,并且以后也不打算写这样的程序,把QMAKE_LIBS_OPENGL = -lGL这个去掉就可以了。

解决Qt5.7.0 cannot find -lGL的更多相关文章

  1. 【Qt开发】解决Qt5.7.0中文显示乱码的问题

    [Qt开发]解决Qt5.7.0中文显示乱码的问题 亲测可用: 乱码主要是编码格式的问题,这里可以通过Edit菜单中选择当前文档的编码方式,选择按照UTF-8格式保存,然后输入对应的中文,保存,然后运行 ...

  2. QT笔记之解决QT5.2.0和VS2012中文乱码 以及在Qt Creator中文报错

    转载:http://bbs.csdn.net/topics/390750169 VS2012 中文乱码 1.方法一: 包含头文件 #include <QTextCodec> ....... ...

  3. WIN7+QT5.2.0 连接oracle11g问题及解决方法

    用下面的代码建立连接之后,出现了几个问题 //连接数据库 QSqlDatabase db = QSqlDatabase::addDatabase("QOCI"); /**连接Ora ...

  4. linux下编译qt5.6.0静态库——configure配置

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  5. linux下编译qt5.6.0静态库——configure配置(超详细,有每一个模块的说明)(乌合之众)

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  6. linux下编译qt5.6.0静态库(使用./configure --help来看看都有哪些参数。超详细,有每一个模块的说明。如果改变了安装的目录,需要到安装目录下的bin目录下创建文件qt.conf)(乌合之众)good

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  7. Fedora Linux 安装Qt5.2.0

    1.下载 qt-linux-opensource-5.2.0-x86-offline.run 2. chmod u+x ./qt-linux-opensource-5.2.0-x86-offline. ...

  8. VS2013编译Qt5.6.0静态库

    获取qt5.6.0源码包 直接去www.qt.io下载就好了,这里就不详细说了. 这里是我已经编译好的** 链接:http://pan.baidu.com/s/1pLb6wVT 密码: ak7y ** ...

  9. Linux系统下 解决Qt5无法连接MySQL数据库的方法

    Linux平台下解决Qt5连接mysql数据库的问题:输入sudo apt-get install libqt5sql5-mysql解决,这种方法只能解决Qt是用sudo apt-get instal ...

随机推荐

  1. Chapter 4. Using the Gradle Command-Line 使用gradle命令行

    This chapter introduces the basics of the Gradle command-line. You run a build using the gradle comm ...

  2. git常用命令<转>

    (转自)https://www.akii.org/git-concise-operating-tutorial.html git工作原理: 分布式,每个克隆或更新远程仓库的用户都拥有⼀一份最新的完整的 ...

  3. AS 自动生成选择器 SelectorChapek

    简介 https://github.com/inmite/android-selector-chapek 设计师给我们提供好了各种资源,每个按钮都要写一个selector是不是很麻烦? 这么这个插件就 ...

  4. SuperSocket快速入门(一):什么是SuperSocket

    什么是SuperSocket SuperSocket(下文简称SS)是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 ...

  5. mysql的replication(主从同步)总结

    很好的文章,对mysql的主从架构有深入理解. mysql主从同步,从master同步数据到slave慢的情况下,是不是可以改成多线程处理加快同步速度? 参考文章如下: MySQL Replicati ...

  6. 【转】深入理解Java内存模型(一)——基础

    并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体).通信是指线程之间以何种机制来交换信息.在命令式编程中,线程之间的通信 ...

  7. PHP Zip File

    安装 如需在服务器上运行 Zip File 函数,必须安装这些库: Guido Draheim 的 ZZIPlib 库: 下载 ZZIPlib 库 Zip PELC 扩展:下载 Zip PELC 扩展 ...

  8. PHP 杂项 函数

    安装 杂项函数是 PHP 核心的组成部分.无需安装即可使用这些函数. Runtime 配置 杂项函数的行为受 php.ini 文件中的设置的影响. 杂项配置选项: 名称 默认 描述 可更改 ignor ...

  9. Oracle数据库之数据类型

    Oracle数据库之数据类型 Oracle基本数据类型(亦叫内置数据类型,internal datatypes或built-in datatypes)可以按类型分为:字符串类型.数字类型.日期类型.L ...

  10. MySQL重置root用户密码的方法(转)

    本教程适用于采用Win2003.WinXP操作系统的迅美VPS和云主机产品. 当管理员忘记MySQL密码怎么办?屡次输入密码,仍然提示错误,网站无法正常运行,数据库也无法管理,管理员束手无策. 网站程 ...