FLTK 简介
从网上引用的一段 FLTK 的介绍
FLTK (Fast Light Tool Kit 发音为fulltick) 是一种使用 C++ 开发的 GUI 工具包,它可以应用于 Unix, Linux, MS-Windows95/98/NT/2000 和 MacOS 操作系统平台,相对于其它的许多图形接口开发工具包(如MFC、GTK、QT等),它具有体积小、速度快的优点,且有着更好的移植性。
说白了,FLTK 就是一个 C++ 的界面库,可以用于开发图形界面,它具有如下特点,也是优点:
- 非常轻量小巧,性能很好。
- 提供丰富的跨平台的 GUI 组件 (Widget),有按钮,菜单,窗口等近六十个。
- 提供 Fl_GL_Window,支持 OpenGL 相关的操作。
- 提供界面设计工具 FLUID,能非常方便进行界面的设计(个人感觉仅仅是相对方便,Qt 更方便)。
- 良好的跨平台移植性,支持各种操作系统。
- 支持多种 C++ 编译器,如 GCC,VC,Clang 等等。
- 灵活性,FLTK 本身可以定制,以满足不同的需要,这使得 FLTK 在嵌入式开发上有着极大的优势。
也正是有这些优点,所以 C++ 之父推荐也推荐初学者使用。但 FLTK 的缺点也很明显:
- 几乎不做系统 API 的封装,如果需要可移植性,则需要自己封装系统 API。
- 界面比较 Low,如果想要开发漂亮的界面,请移步 Qt。
- 对绘图、动画或视频相关的界面支持不足,容易有问题(网上查到的,我还没有遇见过)。
个人感觉,FLTK 轻量小巧,上手简单,非常适合用于开发项目原型,或制作小工具,是一个值得推荐学习的 GUI 项目。
FLTK 安装
FLTK Windows安装
在 Windows 下推荐使用 cmake 安装,默认安装生成静态库。编译命令如下:
# 生成项目
cmake -G "Visual Studio 14 2015 Win64" \
-DCMAKE_INSTALL_PREFIX=D:\tmp\fltk-1.4.x \
-DCMAKE_BUILD_TYPE=Release \
-DZLIB_LIBRARY=D:\ProgramFiles\zlib\lib \
-DZLIB_INCLUDE_DIR=d:\ProgramFiles\zlib\include \
-DFLTK_BUILD_EXAMPLES=ON ..
# 编译为 Release 版本
cmake --build . --config Release
# 安装到指定路径
cmake --install .
cmake 指令说明:
-
-G “Visual Studio 14 2015 Win64”
指定项目生成环境,我使用 VS 2015 生成项目,生成 64 位版本。
-
-DCMAKE_INSTALL_PREFIX=path
指定项目的安装路径
-
-DCMAKE_BUILD_TYPE=Debug|Release
指定项目的编译类型,一般是 Debug 或 Release。我在编译时,发现此设置不起作用,还是会编译为 Debug版本,不知何故,所以在第二步的编译时,添加了
--config Release
设置。 -
-DZLIB_LIBRARY=path
指定 zlib 库文件的路径,默认可以不加,使用 FLTK 自带的 zlib 库。
-
-DZLIB_INCLUDE_DIR=path
指定 zlib 头文件的路径,默认可以不加,使用 FLTK 自带的 zlib 库。
-
-DFLTK_BUILD_EXAMPLES=ON
编译 example 目录中的文件,默认不会编译,只有 test 。
最后两项是添加 zlib 头文件和库文件的路径,不是必须的,若指定,会多生成一个 fltk_z.lib 库文件。
FLTK Linux 安装
FLTK Linux 安装与 Windows 是一样的,也可以使用 ./configure --prefix && make && make install
直接安装,总的来说,要比 Windows 简单一点。
我在 CentOS7 的虚拟机上安装时,提示缺少 Xft,直接 yum 安装即可:
yum install libXft-devel
FLTK 简单示例
安装完成后,就可以直接写 FLTK 应用程序了,下面是一个简单的 hello world 的示例
// desc: FLTK hello world 示例
// file: hello.cpp
#include "FL/Fl.H"
#include "FL/Fl_Window.H"
#include "FL/Fl_Box.H"
int main(int argc, char* argv[]) {
Fl_Window *window = new Fl_Window(340, 180, "hello");
Fl_Box *box = new Fl_Box(20, 40, 300, 100, "Hello, World!");
box->box(FL_UP_BOX);
box->labelfont(FL_BOLD + FL_ITALIC); // 加粗,斜体
box->labelsize(36);
box->labeltype(FL_SHADOW_LABEL);
window->end();
window->show(argc, argv);
return Fl::run();
}
我使用 VS 2015 生成项目,需要先设置 FLTK 的头文件和库文件路径,添加 fltk.lib,但编译时还是会报引用错误,而且有好多引用错误,如
1>fltk.lib(fl_WinAPI_platform_init.obj) : error LNK2001: 无法解析的外部符号 GdiplusStartup
1>fltk.lib(Fl_GDI_Graphics_Driver_line_style.obj) : error LNK2001: 无法解析的外部符号 GdipSetPenStartCap
1>fltk.lib(Fl_GDI_Graphics_Driver.obj) : error LNK2001: 无法解析的外部符号 GdipSetPenEndCap
1>fltk.lib(Fl_GDI_Graphics_Driver_line_style.obj) : error LNK2001: 无法解析的外部符号 GdipSetPenEndCap
1>fltk.lib(Fl_GDI_Graphics_Driver.obj) : error LNK2001: 无法解析的外部符号 GdipSetPenLineJoin
1>fltk.lib(Fl_GDI_Graphics_Driver_line_style.obj) : error LNK2001: 无法解析的外部符号 GdipSetPenLineJoin
1>fltk.lib(Fl_win32.obj) : error LNK2001: 无法解析的外部符号 __WSAFDIsSet
1>fltk.lib(Fl_win32.obj) : error LNK2001: 无法解析的外部符号 __imp_select
1>fltk.lib(Fl_win32.obj) : error LNK2001: 无法解析的外部符号 __imp__TrackMouseEvent
这是因为 fltk.lib 还依赖了很多 Windows 系统库,需要将其引用进来,所以还需要引入如下库文件
gdiplus.lib
comctl32.lib
ws2_32.lib
user32.lib
这也算 Windows 下编程比较坑的地方,标准路径下的系统库都需要手动引入。再次编译,大功告成,运行结果如下图
那如何才能知道 FLTK 项目依赖了哪些 Windows 系统库,有两种方法:
- 方法一:逐个将无法解析的符号放在网络上搜索,一般都能查明出处。
- 方法二:在 cmake 编译 FLTK 项目时,会产生一系列的中间文件,可以查看文件 test/hello.dir/Release/hello.tlog/link.command.1.tlog,里面就是记录 FLTK 自带的 hello 项目所需要的所有依赖文件。