Windows基于Mingw编译安装FLTK

2023-12-26 19:09:37

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

最近在研究FLTK,突然对它感了兴趣,就想使用Clion跑一些项目,结果基于FLTK源代码编译在Windows11上各种报错。我仔细研究了下ide描述,基本可以确定主要基于VS的配置,MingW官方只是轻描淡写了下,实际编译还是报错。经过一下午不断摸索,终于跑起来了Demo,现在分享给需要的各位。

CPU:I5 13600KF
OS:Windows11 64bits


一、FLTK是什么?

FLTK (Fast Light Tool Kit 发音为full tick) 是一种使用C++开发的GUI工具包,它可以应用于Unix,Linux,MS-Windows95/98/NT/2000/XP/Vista/7/10/11和MacOS操作系统平台,相 对于其它的许多图形接口开发工具包(如MFC、GTK、QT等),它具有体积很小、速度比较快,且有着更好的移植性。

研究它纯粹是因为移植性还可以,而本身又属于比较轻量化的图形库,如果像开发炫酷的GUI,推荐还是QT5QT6,这都是后话了。

二、下载源代码

我反正是没找到bin,只找到源代码。
官网下载页面

如果你跟我一样是Windows11,建议你下载1.3.9以后的版本,兼容性会更好,不保证之前的版本可以运行在Windows11上。

在这里插入图片描述

三、准备编译环境

我使用的是Clion-2023.3.1版本,理论上Clion版本都行,但一定要使用MingW(Clion自带)。

四、导入项目到Clion

为什么导入到Clion,因为本身FLTK就有configureCmakeLists.txt两个文件,支持两种编译方式。只是configure这种在Linux上使用比较方便,Windows上几乎不行(我没研究透)。所以,今天就基于Cmake构建

五、修改Cmake配置

源代码里和配置里处处可以看到MSVC的字眼,所以如果想在MingW上编译成功,就必须改些东西,否则链接阶段会报错。

主要更改3个文件,src/CMakeLists.txtCmake/options.cmakeCMakeLists.txt

1.src/CMakeLists.txt

原配置是基于MSVC设置的,要想支持MingW就需要更改区分。
原文:

 if (OPTION_USE_SYSTEM_LIBJPEG)
    target_link_libraries (fltk_images_SHARED ${FLTK_JPEG_LIBRARIES})
  else()
    target_link_libraries (fltk_images_SHARED fltk_jpeg_SHARED)
  endif (OPTION_USE_SYSTEM_LIBJPEG)

  if (OPTION_USE_SYSTEM_LIBPNG)
    target_link_libraries (fltk_images_SHARED ${FLTK_PNG_LIBRARIES})
  else()
    target_link_libraries (fltk_images_SHARED fltk_png_SHARED)
  endif (OPTION_USE_SYSTEM_LIBPNG)

  if (OPTION_USE_SYSTEM_ZLIB)
    target_link_libraries (fltk_images_SHARED ${FLTK_ZLIB_LIBRARIES})
  else()
    target_link_libraries (fltk_images_SHARED fltk_z_SHARED)
  endif (OPTION_USE_SYSTEM_ZLIB)

改为:

  if (OPTION_USE_SYSTEM_LIBJPEG)
    target_link_libraries (fltk_images_SHARED ${FLTK_JPEG_LIBRARIES})
  else()
    if (MSVC)
      target_link_libraries (fltk_images_SHARED fltk_jpeg_SHARED)
    else ()
      target_link_libraries (fltk_images_SHARED fltk_jpeg)
    endif ()
  endif (OPTION_USE_SYSTEM_LIBJPEG)

  if (OPTION_USE_SYSTEM_LIBPNG)
    target_link_libraries (fltk_images_SHARED ${FLTK_PNG_LIBRARIES})
  else()
    if (MSVC)
      target_link_libraries (fltk_images_SHARED fltk_png_SHARED)
    else ()
      target_link_libraries (fltk_images_SHARED fltk_png)
    endif ()
  endif (OPTION_USE_SYSTEM_LIBPNG)

  if (OPTION_USE_SYSTEM_ZLIB)
    target_link_libraries (fltk_images_SHARED ${FLTK_ZLIB_LIBRARIES})
  else()
    if (MSVC)
      target_link_libraries (fltk_images_SHARED fltk_z_SHARED)
    else ()
      target_link_libraries (fltk_images_SHARED fltk_z)
    endif ()
  endif (OPTION_USE_SYSTEM_ZLIB)

2.Cmake/options.cmake

改动配置文件,增加编译动态库

#原文
option (OPTION_BUILD_SHARED_LIBS
  "Build shared libraries (in addition to static libraries)"
  OFF
)

#改为
option (OPTION_BUILD_SHARED_LIBS
  "Build shared libraries (in addition to static libraries)"
  ON
)

3.CMakeLists.txt

这个是主目录下的文件,上面的是src目录下的文件,不要改错了。主要是更改安装目录,默认C盘是需要管理员权限的,一定要执行target install,因为target install会把bin、lib、include和配置一起集中起来,要不然你还得自己挨个找,如果漏掉了还会导致各种引用报错,所以不如install来的划算。

在这里插入图片描述

set(CMAKE_INSTALL_PREFIX "./install")

六、编译

这里我居然内存溢出了,看了下Clion默认是-j 10,怪不得,我才16G的内存。如果你内存很大就没关系,我是改为了-j 6

一切都准备好就执行build,等待完成,然后install。到cmake-build-debug或cmake-build-release里面的install文件夹下找你需要的所有东西。

在这里插入图片描述

七、运行测试程序

自带了一个测试程序fluid.exe,双击即可运行。成功后大概是长这样。
在这里插入图片描述

八、Demo

怎么会没有测试代码呢,要不然别人认为我忽悠呢。

CmakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(fltk_demo)

set(CMAKE_CXX_STANDARD 11)
include_directories(include)
include_directories(include/FL)
include_directories(include/FL/images)

link_directories(lib)

add_executable(fltk_demo main.cpp)
target_link_libraries(${PROJECT_NAME} fltk_jpeg)
target_link_libraries(${PROJECT_NAME} fltk_png)
target_link_libraries(${PROJECT_NAME} fltk_z)
target_link_libraries(${PROJECT_NAME} fltk_forms)
target_link_libraries(${PROJECT_NAME} fltk_images)
target_link_libraries(${PROJECT_NAME} fltk_gl)
target_link_libraries(${PROJECT_NAME} fltk)

main.cpp

#include <iostream>
#include <Fl.H>
#include <Fl_Window.H>
#include <Fl_Box.H>


int main(int argc, char **argv) {
    auto *window = new Fl_Window(340, 180);
    auto *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();
}

其它
在这里插入图片描述
运行结果大概是下面这样
在这里插入图片描述


总结

1、没想象中那么难,一开始以为要上VS大法了,结果虚惊一场。
2、Linux上会简单很多

文章来源:https://blog.csdn.net/jiexijihe945/article/details/135225228
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。