После прохождения курса по 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.
Все здорово, но как это обычно бывает, руки чешутся чтобы попробовать новые возможности по работе с графикой после 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,"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(); }
с помощью вышеуказанных компиляторов работал исправно.
А затем был поиск заголовочных файлов и исходных кодов для интерфейса от Страутструпа. О том, что они лежат в разделе 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 = "C:/msys/opt/FLTK/bin" # 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. После этого выполняем упражнения и наслаждаемся результатом.
Очень рекомендую к прочтению всем, кто только начал изучение C++ и тем, кто хочет освежить свои знания в связи с выходом стандарта C++11 и C++14. К сожалению второй том пока доступен только на английском.
Можно купить на Amazon или Books.ru (как-то была последняя версия книги, но в последнее время не видел).