解決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

我的系統確實存在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         += 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這個去掉就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM