好久沒用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這個去掉就能夠了。