Intereting Posts
Трифоры все еще действительны C ++? Передача массива символов C ++ для работы Вызывается конструктор перемещения после вызова функции преобразования? С помощью OpenCV попробуйте извлечь область изображения, описанную ArrayOfArrays Недопустимый аргумент аргумента wait_condition Как скрыть окно терминала в mac osx? Как объединить несколько статических связанных библиотек в одну dll, если каждый static lib определяет экспортированную функциональность (vc ++ 2008)? Требует ли привязка к ссылке ссылаться на конструктор копирования в C ++? Как написать функцию, которая принимает iterator или коллекцию в общем виде? Как преобразовать void (__thiscall MyClass :: *) (void *) в void (__cdecl *) (void *) указатель Выравнивание изображений на основе обнаруженных признаков в Opencv Что происходит при использовании make_shared C ++ – Что означает эта структура двойного указателя / массива? У меня проблемы с этим Typedef с двумя наборами скобок? Возврат указателя против передачи ссылки на объект для хранения ответа в C ++

Stroustrup’s Simple_window.h

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

#include  #include  #include  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 . . . Пространство 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' 

и т.п.

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

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

После установки 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 

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

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

  1. Я раскоментил std_lib_facilities.h на Graph.h
  2. Чтобы устранить двусмысленность windows, мне нужно было указать Graph_lib :: Window в строке 9 Simple_window.h
  3. std_lib_facilities.h в строках 107 и 113 использует сравнение i <0, когда i без знака (но это только предупреждения).
  4. Graph.h строка 159 использует fl_color (), но компилятор говорит, что это должен быть Fl_Color
  5. Мне нужно было разогнать конструкторы для Point in 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 и next. Кстати, wait_for_button не работает ни в одной из форм.
  7. В GUI.cpp существует другое переопределение для конструктора Menu. Я прокомментировал это.
  8. Я изменил последнюю строку примера раздела 12.3 на win.wait_for_button; в Fl :: run (); который я взял из примера в приложении D, потому что в противном случае окно не закрывается с помощью кнопки закрытия.

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

Я надеюсь, что следующий человек не должен тратить все время, что я должен был.

Edit: Ну, проверяя мою систему и команду компиляции, я понял, что повторяется несколько ковров … и что на самом деле их не существует в моей системе 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 

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

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

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

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

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

Я решил эту проблему (или, по крайней мере, мне удалось отобразить окно с треугольником). Однако это было только после комментирования и редактирования больших частей кода Страустрапа. Я не чувствую, что его книга очень подходит для новичка. Я также не рекомендую пытаться скомпилировать любой из его примеров с помощью 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 с сайта Stroustrup. Затем прочитайте readme и следуйте инструкциям, прежде чем пытаться выполнить тестовую программу в приложении D к книге. Затем попробуйте его примерный код, который повторно фиксирует найденные вами ошибки до тех пор, пока он не будет работать. Если вы думаете, что я могу помочь или хочу знать, как я получил свое решение, напишите мне (но я новичок и вряд ли буду полезен).

Натан,

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

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 :: Окно» на линии 17 Simple_window.h из-за неоднозначного эталонным ошибки. Это было единственное изменение, которое мне пришлось внести в код Страустрапа.

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

Основываясь на этом, я создал repository github, который внедрил все эти изменения и многое другое, и содержит подробные сведения о том, как построить проект:

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

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

Simple_window.h

  1. Разрешить конфликт пространства имен Изменить struct Simple_window : Window { to
    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. Uncomment #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. В Меню: Виджет, измените Меню (Точка xy …) на декларацию, а не на def, закомментируйте Widget def stuff.

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

 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 .

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

Сбор данных FLTK – PPP2ndEd