Stroustrup's Simple_window.h - PullRequest
       22

Stroustrup's Simple_window.h

6 голосов
/ 20 августа 2011

Я пытаюсь заставить графические примеры работать из Принципов и практик Страуструпа ... C ++, но безрезультатно (пока).Я установил fltk и знаю, что он работает нормально, так как мне удалось получить окно для отображения с помощью программы, предложенной в приложении к его книге:

#include <FL/Fl.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Window.H>

int main(){

    Fl_Window window(200,200, "title here");
    Fl_Box box(0,0,200,200,"Hey, hello wrld");
    window.show();
    return Fl::run();
}

Однако, пытаясь самостоятельно использовать егоSimple_window.h (можно найти на его сайте) дает «двусмысленную ссылку на« Window », поскольку он уже находится в usr / include / X11 / Xh.Поэтому я попытался указать пространство имен для соответствующего:

struct Simple_window : Graph_lib::Window {  //Changed Window to inc. namespace
    Simple_window(Point xy, int w, int h, const string& title );

    bool wait_for_button(); // simple event loop

.
.
.

Но это дает мне еще кучу ошибок, которых я не понимаю:

$ clear; g++ -Wno-deprecated window.cpp -o holz
    /tmp/ccIFivNg.o: In function `main':
    window.cpp:(.text+0x64): undefined reference to `Simple_window::Simple_window(Point, int, int, String const&)'
    /tmp/ccIFivNg.o: In function `Graph_lib::Window::~Window()':
    window.cpp:(.text._ZN9Graph_lib6WindowD2Ev[_ZN9Graph_lib6WindowD5Ev]+0x14): undefined reference to `vtable for Graph_lib::Window'

и т. Д.

Я чувствую, что освоение графики будет долгой и трудной дорогой -_-

Ответы [ 6 ]

3 голосов
/ 31 марта 2016

Для всех, кто находится в таком же затруднительном положении, я оставляю здесь то, что сделал, чтобы, наконец, иметь возможность скомпилировать и получить окно первой программы с FLTK в разделе 12.3 книги Страуструпа «Программирование: принципы и практика с использованием C ++, 2-е издание».

После установки FLTK на Kubuntu 14.04 с

$ sudo apt install libfltk1.3-dev

я смог скомпилировать пример программы в Приложении D с использованием

$ fltk-config --compile fltkTest.cpp

Благодаря этому посту,Я мог увидеть, как наконец-то справиться с первым примером главы 12. Сравнивая команду cwivagg и Nathan с командой, сгенерированной с помощью fltk-config, я закончил эту команду

$ clang++ -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/freetype2 -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -g -O2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT -Wl,-Bsymbolic-functions -lfltk_images -lfltk -lX11 -std=c++11 -o 's12_3_first' 's12_3_first.cpp' Simple_window.cpp Graph.cpp GUI.cpp Window.cpp

Iпришлось добавить -lfltk_images и -std = c ++ 11

Однако теперь мне пришлось иметь дело с ошибками, которые дал мне компилятор.Чтобы получить работающую программу, мне пришлось сделать несколько изменений в источниках, которые Страуструп дал на http://www.stroustrup.com/Programming/PPP2code/

  1. Я оставил комментарий std_lib_facilities.h на Graph.h
  2. Чтобы устранить неоднозначностьокна, мне нужно было указать Graph_lib :: Window в строке 9 Simple_window.h
  3. std_lib_facilities.h в строках 107 и 113 использует сравнение ai <0, когда я не подписан (но это всего лишь предупреждения). </li>
  4. Строка 159 Graph.h использует fl_color (), но компилятор говорит, что это должен быть Fl_Color
  5. Мне нужно раскомментировать конструкторы для Point в Point.h
  6. Существует несколько переопределенийв Simple_window.cpp из Simple_window.h В Simple_window.cpp я закомментировал определения для конструктора, cb_next и wait_for_button (что не совпадает с определением для Simple_window.h).На Simple_window.h я прокомментировал определения wait_for_button и далее.Кстати, wait_for_button не работает ни в одной из форм.
  7. В GUI.cpp есть другое переопределение для конструктора Menu.Я закомментировал это.
  8. Я изменил последнюю строку примера раздела 12.3 из win.wait_for_button;чтобы Fl :: бежать ();который я взял из примера в Приложении D, потому что в противном случае окно не закрывается с помощью кнопки закрытия.

Со всеми этими изменениями у меня наконец-то есть окно, как и должно быть, и окно закрывается либос помощью кнопки Next или кнопки закрытия указанного окна (с помощью wait_for_button мне нужно было завершить программу из Konsole с помощью Ctrl-c после того, как я пытался закрыть ее с помощью кнопки закрытия окна).

Надеюсьследующий человек не должен тратить все время, которое мне пришлось потратить.

Редактировать: Что ж, проверив свою систему и команду компиляции, я понял, что повторяются несколько ковров ..и что они на самом деле не существуют в моей системе Kubuntu.Итак, я должен записать в своем ответе, что я наконец-то сделал, чтобы заставить окно работать:

Чтобы получить объектный файл:

$ clang++ -O2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT -g -std=c++11 -c  Simple_window.cpp

Чтобы получить первую программу, которую мы хотели

% clang++ -O2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT -Wl,-Bsymbolic-functions -lfltk_images -lfltk -lX11 -g -std=c++11 Simple_window.o Graph.o GUI.o Window.o -o z3 s12_3_first.cpp

Это чертовски легко (я почти могу писать их каждый раз, когда они мне нужны)

1 голос
/ 10 июля 2014

Nathan,

Ваш ответ мне очень помог в моей собственной борьбе за реализацию простой программы треугольника Страуструпа. Я хотел бы опубликовать свое собственное решение на основе вашего. После одного изменения в коде Страуструпа и значительно расширенного сценария компиляции я получил треугольник.

g++ -I/usr/localinclude -I/usr/local/include/FL/images -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_THREAD_SAFE -D_REENTRANT -o 'myimplementationofstroustrup.o' 'myimplementationofstroustrup.cpp' 'Simple_window.cpp' 'Graph.cpp' 'GUI.cpp' 'Window.cpp' /usr/local/lib/libfltk.a -lpthread -ldl -lm -lX11 -L/usr/local/lib -lfltk_images -lfltk_png -lfltk_z -lfltk_jpeg -lfltk

Различия с вашей следующие:

1) Мне пришлось добавить кавычки ко всем моим файлам .cpp ... системное различие, возможно?
2) Мне пришлось добавить шесть флагов в конце, которые вы не использовали, иначе я получил больше ошибок «неопределенная ссылка».
3) Мне пришлось указать «Graph_lib :: Window» в строке 17 Simple_window.h из-за неоднозначной ошибки ссылки. Это было единственное изменение, которое я должен был внести в код Страуструпа.

1 голос
/ 21 августа 2011

Томолак, когда вы сказали, что это «прогресс», мне очень понравилось.Не знаю, если вы были саркастичны, но что угодно.

Я решил эту проблему (или, по крайней мере, мне удалось заставить окно появляться с треугольником в нем).Однако, это было только после того, как закомментировали и отредактировали большие части кода Страуструпа.Я не чувствую, что его книга очень подходит для начинающего.Я также не рекомендовал бы пытаться скомпилировать любой из его примеров с использованием Linux.

Для всех, кто ищет эти проблемы, мое окончательное решение было следующей командой:

$ g++ -Wno-deprecated -I/usr/local/include -I/usr/include/freetype2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT -o 'windows_working' win_test.cpp Graph.cpp GUI.cpp Simple_window.cpp Window.cpp  /usr/local/lib/libfltk.a -lXext -lXft -lfontconfig -lXinerama -lpthread -ldl -lm -lX11

Это включает в себя все, что требуется суважение к вещам fltk и Stroustrup.Здесь моя программа - win_test.cpp, а выходные данные - windows_working.Я получил это, просматривая скрипт оболочки, предоставленный с файлами fltk, и поместил в / usr / inc / bin.Он называется fltk-config.

Также полезными советами являются: загрузите источник fltk со своего сайта, а не только FL с сайта Страуструпа.Затем прочитайте файл readme и точно следуйте инструкциям, прежде чем пробовать тестовую программу в приложении D к книге.Затем попробуйте его пример кода, неоднократно исправляя найденные ошибки, пока он не заработает.Если вы думаете, что я могу помочь или хотите узнать, как я получил свое решение, напишите мне (но я новичок, и поэтому вряд ли пригодится).

1 голос
/ 20 августа 2011

Ну, это не имеет ничего общего с графикой как таковой. Кажется, проблема в том, что вы включили в командную строку только один из исходных файлов, которые вам нужно скомпилировать. Судя по его сайту

g ++ graph.cpp GUI.cpp Simple_window.cpp Window.cpp

похоже, больше похоже на это. Но у меня нет реального опыта этого.

0 голосов
/ 12 июня 2018

Существует очень подробное описание того, как это исправить в ветке на форуме книги:
https://groups.google.com/forum/#!msg/ppp-public/BtlzdWGuQpQ/KuDN4u-SPKgJ

На основании этого я создал репозиторий github, в котором реализованы все эти изменения и многое другое.и включает в себя подробную информацию о том, как построить проект:

https://github.com/cortical-iv/hello_fltk

Я потратил около двух недель на эту проблему, и мои знания (которые в основном получены от других) действительнооткровенно воплощен в этом кодексе и будет постоянно обновляться.Но это переполнение стека, так что с точки зрения изменений, которые мне пришлось внести в код, большинство из них можно найти на этом форуме, но поскольку не очень удобно давать ответы по ссылкам, вот они:

Simple_window.h

  1. Устранить конфликт пространства имен Изменить struct Simple_window : Window { на
    struct Simple_window : Graph_lib::Window {

  2. Simple_window () преобразуется в объявление (удаление определения).

  3. Преобразование wait_for_button() из определения в объявление (закомментируйте весь def в цикле while) и измените с void на bool, чтобы соответствоватьопределение в Simple_window.cpp.

  4. Превращено cb_next(...) в декларацию

  5. Превращение void next() в декларацию

Graph.h
1. Раскомментируйте #include "std_lib_facilities.h"
2. Измените fl_color на Fl_Color (~ строка 159)

Graph.cpp 1. Заменить can_open на: bool can_open (const string & s) // проверить, существует ли файл с именем s и может ли он быть открыт для чтения {ifstream ff (s);return ff.is_open ();}

Point.h
1. Раскомментируйте конструкторы

Point(int xx, int yy) : x(xx), y(yy) { }    
Point() :x(0), y(0) { }

Gui.h
1. В меню: виджет, измените Menu (Точка xy ...) на объявление, а не на def, закомментируйте Widget def.

После того, как вы сделали вышеупомянутое, он должен скомпилироваться, если вы выполните следующую команду на своем терминале:1072 *

g++ -w -Wall -std=c++11 Graph.cpp Window.cpp GUI.cpp Simple_window.cpp main.cpp `fltk-config --ldflags --use-images` -o hello_fltk

Если вы установили fltk с помощью cmake, то вы также можете собрать пример с помощью cmake / make: в хранилище есть файл CMakeLists.txt.

0 голосов
/ 11 июля 2017

Это краткое изложение проблем и исправлений также очень полезно для того, чтобы заставить его работать на разных платформах.Действительный исправленный код доступен для скачивания:

Компиляция FLTK - PPP2ndEd

...