Ubuntu下解决Qt5.7.0 cannot find -lGL(亲测解决)

2023-10-08 20:40

本文主要是介绍Ubuntu下解决Qt5.7.0 cannot find -lGL(亲测解决),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

很久没用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
复制代码

也就是说,只要先输入:locate libGL,回车后再输入: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这个去掉就可以了。


原文链接:https://www.cnblogs.com/coding-my-life/p/5677256.html


这篇关于Ubuntu下解决Qt5.7.0 cannot find -lGL(亲测解决)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/u012677715/article/details/78553230
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/167843

相关文章

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

解决JSONField、JsonProperty不生效的问题

《解决JSONField、JsonProperty不生效的问题》:本文主要介绍解决JSONField、JsonProperty不生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录jsONField、JsonProperty不生效javascript问题排查总结JSONField

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

Swagger在java中的运用及常见问题解决

《Swagger在java中的运用及常见问题解决》Swagger插件是一款深受Java开发者喜爱的工具,它在前后端分离的开发模式下发挥着重要作用,:本文主要介绍Swagger在java中的运用及常... 目录前言1. Swagger 的主要功能1.1 交互式 API 文档1.2 客户端 SDK 生成1.3

java连接opcua的常见问题及解决方法

《java连接opcua的常见问题及解决方法》本文将使用EclipseMilo作为示例库,演示如何在Java中使用匿名、用户名密码以及证书加密三种方式连接到OPCUA服务器,若需要使用其他SDK,原理... 目录一、前言二、准备工作三、匿名方式连接3.1 匿名方式简介3.2 示例代码四、用户名密码方式连接4

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复