解決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這個去掉就能夠了。

相關文章
相關標籤/搜索