关于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了吧! 点个赞吧!

猜你喜欢

转载自blog.csdn.net/u012734169/article/details/85461006