解决Qt5.7.0 cannot find -lGL

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

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

  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这个文件。按他的方法解决了问题。若是你的系统确实没这个文件,那真是要安装了。ubuntu

  程序能跑起来了,不过并无解决个人疑问: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,决定手动测试一下。测试

  清理项目,从新编译一次,而后切换到编译输出:ui

能够看到编译的参数,我手动进入到对应的目录,而后改一下编译参数:this

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参数编译连接的程序,也能够正常跑,验证了个人想法。spa

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

  这些预先定好的参数,按平台放在安装目录的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这个去掉就能够了。

相关文章
相关标签/搜索