错误描述
在创建一个新的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了吧! 点个赞吧!