1. 程式人生 > >關於QT5的GUI程式編譯出現-lGL編譯問題的解決辦法

關於QT5的GUI程式編譯出現-lGL編譯問題的解決辦法

錯誤描述

在建立一個新的QT Widgets Application後,直接編譯會出現 “error: cannot find -lGL” 的錯誤提示。

查詢資料

這主要是由於QT5自動預設添加了OPENGL庫的引用導致的, 如果開發環境已經安裝了OPENGL庫就不會出現上述提示, 在網上搜索了一些解決方案,主要是採用安裝缺少的庫檔案的辦法解決:

 sudo apt-get install libgl1-mesa-dev

還有一些文章順便推薦安裝一些學習工具, 可以參考這裡

上述方案雖然可以使用專案正常編譯, 但並不能達到我期望的標準. 因為我的專案並沒有使用OPENGL, 引入沒有使用的庫會導致我的強迫症復發.

解決方案

  • 觀察編譯視窗錯誤資訊.
g++ -Wl,-rpath,/usr/Qt5.12.0/5.12.0/gcc_64/lib -o untitled main.o mainwindow.o moc_mainwindow.o   -L/usr/Qt5.12.0/5.12.0/gcc_64/lib -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread

最後的編譯選項中存在的"-lGL" 就是問題所在:

-lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread
  • 修改編譯選項
    這個編譯選項是在 /usr/Qt5.12.0/5.12.0/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_EGL          = -lEGL
QMAKE_LIBS_OPENGL       = -lGL                 # 重點看這行編譯選項.
QMAKE_LIBS_OPENGL_ES2   = -lGLESv2
QMAKE_LIBS_OPENVG       = -lOpenVG
QMAKE_LIBS_THREAD       = -lpthread
QMAKE_LIBS_VULKAN       =

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_AR                = ar cqs
QMAKE_OBJCOPY           = objcopy
QMAKE_NM                = nm -P
QMAKE_RANLIB            =

QMAKE_STRIP             = strip
QMAKE_STRIPFLAGS_LIB   += --strip-unneeded

把其中QMAKE_LIBS_OPENGL = -lGL 刪除或用"#"符號註釋掉就可以正常編譯了.

  • 改進修改方法
    上述檔案直接開啟是隻讀的, 這是系統編譯選項, 修改這個檔案將導致所有專案都不會開啟"-lGL"編譯選項, 這也會導致強迫症復發. 我們換一種方法: 在專案檔案中控制編譯選項.
    開啟專案的.pro檔案, 找個地方新增一行
QMAKE_LIBS_OPENGL -= -lGL

或者

QMAKE_LIBS_OPENGL = -lGL

這兩種方法區別不再羅嗦, 看不懂的加強基礎知識學習.
到此為止, 清理專案重新編譯, OK了吧! 點個贊吧!