FLTK и Страуструп

После прохождения курса по C++ на Stepic‘е я решил дополнительно перечитать книгу великого Бьёрна Страуструпа. И дошел я до главы 12, в которой рассказывалось о работе с графической библиотекой FLTK, в частности для книги Страуступ подготовил упрощенный интерфейс, который несколько упрощает работу с этой библиотекой. Чем обернулось начало данной главы я расскажу дальше.

До этого все примеры и упражнения в данной книге я делал используя компилятор gcc версии 4.8.1 – 4.8.3 и clang 3.6.0 – 3.7.0 и проблем никаких не было. Все встреченные огрехи были связаны с неправильным копированием из pdf-файла.

Но 12 глава сломала все стереотипы о том, как пишутся книги.

Во-первых, в разделе 12.3 First Example приведен код простенького приложения, которое создает окно, рисует в нем красный треугольник и кнопку Next.

Stroustrup_Principles_and_Practice_Using_C++_2ed_2014

Все здорово, но как это обычно бывает, руки чешутся чтобы попробовать новые возможности по работе с графикой после 11 глав рассматривания вывода в консоли. Ой, да что же это такое? Что за файлы такие Simple_window.h и Graph.h? С установкой FLTK, что самое интересное, проблем не возникло. Для MinGW достаточно скачать исходные коды отсюда и выполнить:

./configure --prefix=<путь куда установить>
make
make install

А в Ubuntu 14.04 и вовсе есть в репозиториях, поэтому установка выполняется одной командой:

apt-get install libfltk1.3-dev

Документация на сайте библиотеки отличная, README для установки подробные. Для начала работы все есть и хоть в errata на сайте Страуструпа сказано, что хорошо бы для данной главы заручиться поддержкой опытных товарищей, никаких проблем даже у новичков, которые хоть раз видели bash-shell и умеют пользоваться поисковиком или говорить „Ок, Гугл“, возникнуть не может. Тестовый пример:

#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);
	Fl_Box *box = new Fl_Box(20,40,300,100,&quot;Hello, World!&quot;);
	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();
}

с помощью вышеуказанных компиляторов работал исправно.

А затем был поиск заголовочных файлов и исходных кодов для интерфейса от Страутструпа. О том, что они лежат в разделе http://www.stroustrup.com/Programming/PPP2code/ конечно же ничего не сказано. Хорошо, поиск нас спасёт и мы находим ту замечательную страницу откуда можно все необходимые файлы скачать. Забегая вперед, о том какие файлы должны быть подключены к проекту (если вы используете Visual Studio) или какие объектные файлы должны быть сгенерированы и обработаны линковщиком сказано только в разделе 12.8.3 и то очень смутно. Дословно:

Headers:

  • Point.h
  • Window.h
  • Simple_window.h
  • Graph.h
  • GUI.h

Code files:

  • Window.cpp
  • Graph.cpp
  • GUI.cpp

Собрать проект не удалось, по каким причинам я не стал долго выяснять. Может его интерфейсные файлы не работали с последней версией FLTK, может в Visual Studio 2005 все собралось бы нормально, но лог вывода gcc 4.8.3 можно посмотреть здесь (Hint: Simple_window.cpp тоже необходимо подключать к проекту, хотя об этом нигде не сказано).

Спасительным оказалось нахождение ссылки на сайте Техасского университета A&M, где преподает Бьёрн Страуструп и где курс CSCE121 основан на его книге.

Для упрощения процесса сборки был написан следующий Makefile:

DEFS = -DWIN32 # define platform
FLTK_FLAGS = --use-images # specify fltk-config flags
FLTK_DIR = &quot;C:/msys/opt/FLTK/bin&quot; # fltk dir
FLTK_LIB = -L$(shell $(FLTK_DIR)/fltk-config --libs $(FLTK_FLAGS)) # fltk libs
FLTK_CXX_FLAGS = $(shell $(FLTK_DIR)/fltk-config --cxxflags) # compiler flags for fltk
FLTK_LD_FLAGS = $(shell $(FLTK_DIR)/fltk-config --ldflags $(FLTK_FLAGS)) # linker flags
FLTK_INC_DIR = -I$(shell $(FLTK_DIR)/fltk-config --includedir) # fltk header files placement
CXX = g++
CXX_FLAGS = -std=c++11
PROJECT = ex3
SOURCE = ex3.cpp
LIBS_S = ../GUI.cpp ../Simple_window.cpp ../Window.cpp ../Graph.cpp

$(PROJECT): $(SOURCE) $(LIBS_S)
 $(CXX) -o $(PROJECT) $(SOURCE) $(DEFS) $(LIBS_S) $(FLTK_LIB) $(FLTK_LD_FLAGS) $(FLTK_INC_DIR) $(CXX_FLAGS) -I../

%.o: %.cpp %.h
 $(CXX) -c $<

Все, дальше можно менять название проекта, имя *.cpp файла и запускать make.

P.S. После этого выполняем упражнения и наслаждаемся результатом.

2015-02-12 17-24-17 Exercise 12

Очень рекомендую к прочтению всем, кто только начал изучение C++ и тем, кто хочет освежить свои знания в связи с выходом стандарта C++11 и C++14. К сожалению второй том пока доступен только на английском.

programming_front

Можно купить на Amazon или Books.ru (как-то была последняя версия книги, но в последнее время не видел).