本博文转自:https://www.cnblogs.com/coding-my-life/p/5677256.html

很久没用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)1.First locate the GL library
2.Then link it under /usr/lib
3.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.1
/usr/lib/i386-linux-gnu/mesa/libGL.so.1.2.0
/usr/lib/x86_64-linux-gnu/libGLEW.so.1.10
/usr/lib/x86_64-linux-gnu/libGLEW.so.1.10.0
/usr/lib/x86_64-linux-gnu/libGLEWmx.so.1.10
/usr/lib/x86_64-linux-gnu/libGLEWmx.so.1.10.0
/usr/lib/x86_64-linux-gnu/libGLU.so.1
/usr/lib/x86_64-linux-gnu/libGLU.so.1.3.1
/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1
/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0
/usr/lib/x86_64-linux-gnu/mesa-egl/libGLESv2.so.2
/usr/lib/x86_64-linux-gnu/mesa-egl/libGLESv2.so.2.0.0
$ sudo ln -s /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 /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         += linuxinclude(unix.conf)QMAKE_CFLAGS_THREAD    += -D_REENTRANT
QMAKE_CXXFLAGS_THREAD  += $$QMAKE_CFLAGS_THREAD
QMAKE_LFLAGS_GCSECTIONS = -Wl,--gc-sectionsQMAKE_LFLAGS_REL_RPATH  = -Wl,-z,origin
QMAKE_REL_RPATH_BASE    = $ORIGINQMAKE_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      = -ludevQMAKE_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-scannerQMAKE_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. oracle百分比变成小数,oracle中计算百分比,并同时解决小数点前0不显示的问题...

    select a.catalog_name,decode(substr(trunc((a.s/b.count2),4)*100||'%',0,1),'.',replace(trunc((a.s/b.c ...

  2. Qt5.7.0编写应用程序找不到库的解决方法

    点击QT生成的应用程序但是发现需要依赖动态库 解决方法: 1.查找QT安装目录我的安装目录是下面的路径在里面找到qtenv2.bat这个文件 D:\QT\Qt5.7.0\5.7\mingw53_32\ ...

  3. 【Qt】Qt5.9.0: error: GL/gl.h: 没有那个文件或目录

    重新安装ubuntu,在编译Qt时报错: /home/Qt5.9.0/Examples/Qt-5.9/widgets/widgets/calculator/button.cpp:51: from -/ ...

  4. linux qt5.9 下载,在Ubuntu17.04上安装QT5.9.0(下载、安装、问题解决)

    注:Ubuntu版本17.04  QT版本5.9.0 1.安装包下载 步骤一:进入网址https://www.qt.io/download/ 步骤二:点击图1进入图2         图1       ...

  5. 解决Qt5 Creator无法切换输入法(fcitx),Ubuntu中不能使用搜狗输入法录入汉字问题...

    2016年6月8日修正,ubuntu 16.04 Qt5.7.0 以及 Qt5.6.1均测试通过 在Qt5.3之前,我发布过解决办法 解决Qt5 Creator无法切换输入法(fcitx),不能录入汉 ...

  6. qt5 linux apt get,Ubuntu 14.04下安装并配置Qt5.7.0

    1.去官网下载离线安装包 (需要注册) linux 64bit : qt-opensource-linux-x64-5.7.0.run 2.安装libgl1-mesa-dev ,否则在编译时会出错,提 ...

  7. 无法定位程序输入点?isPublicID@QXmlUtils@@SA_NAEVVQString@@@Z于动态链接库 D:\Qt\Qt5.7.0\5.7\msvc2015_64\bin\Qt5Cored

    Qt系列文章目录 文章目录 Qt系列文章目录 前言 一.错误原因是什么? 解决办法 前言 主要用到了InfraRender.dll这个动态库,这个动态库又依赖:Qt5Cored.dll.Qt5Guid ...

  8. QT5.12.0警告 zero as null pointer constant

    在QT5.12.0当中输入代码: 出现这个提示: 原因是: C++中,使用0表示空指针 C++11中,使用nullptr来表示空指针 QT5.12.0中使用C++11 解决方法: 把"0&q ...

  9. GPU加速的QT5.6.0交叉编译到4412

    FriendlyARM 4412开发板自带了Mali400 GPU,将QT5.6.0交叉编译到ARM-A9上,步骤如下所述. 1.下载QT5.6.0的源码包qt-everywhere-opensour ...

最新文章

  1. 美国知名投资人愿意投资的30大创意方向
  2. Ubuntu 16.04与Apache虚拟主机配置的步骤详解
  3. HDUOJ-----4510 小Q系列故事——为什么时光不能倒流
  4. 从小害怕数学的他,却成为了科普数学教育的数学家
  5. python链表节点的插入p.next curnode_leetcode刷题总结之链表
  6. sql 相加_Java整数相加溢出怎么办?Java 8 还是厉害!
  7. 这行的压力还是比较大的
  8. java重装机兵机甲咆哮_重装机兵之机甲咆哮流程攻略
  9. 【笔记】LR配置ODBC连接数据库进行参数化(mysql )未完待续
  10. 数据结构笔记(八)-- 链式栈
  11. 117. php empty()函数坑
  12. Java面试知识点汇总
  13. 统计学分析公式 MA移动平均线
  14. 关于pend post 与 accept
  15. Android 虚拟机技术为何至今依旧“屹立不倒”?
  16. gee引擎修改UI界面图文教程
  17. python使用RSA加密算法
  18. 算法每日一题——第六天——干草堆(差分)
  19. 请叫我En-Tan-Mo
  20. 调用Java API发送传真

热门文章

  1. SVA16.14并发断言翻译笔记$inferred_clock和$inferred_disable(六)
  2. arduino控制串口屏
  3. 【修真院JAVA小课堂】redis缓存集群简单介绍
  4. 解决win10显示无线网络已连接但是不能上网的问题
  5. 三星s8怎么分屏操作_双屏互动,大有可为 三星Galaxy Z Fold2 5G的魅力折叠体验
  6. 硬件设计基础----MOS管
  7. python画简便的图片-用python简单处理图片(5):图像直方图
  8. 干货!最全的AI速查表|神经网络,机器学习,深度学习
  9. ROS2/DDS/QoS/主题的记录
  10. Holder类的作用