關於QT5的GUI程式編譯出現-lGL編譯問題的解決辦法
阿新 • • 發佈:2018-12-31
錯誤描述
在建立一個新的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了吧! 點個贊吧!