c++ - Stroustrup 的 Simple_window.h

标签 c++ header fltk

我试图让图形示例从 Stroustrup 的原则和实践...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/X.h 中。所以我尝试将命名空间指定给相关的命名空间:

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'

等等

我觉得掌握图形将是一条漫长而坎坷的道路-_-

最佳答案

对于任何处于同样困境的人,我在这里留下了我所做的,以便最终能够在 Stroustrup 的书“编程:使用 C++ 的原则和实践,第 2 版”的第 12.3 节中使用 FLTK 编译并获得第一个程序的窗口.

在 Kubuntu 14.04 上安装 FLTK 之后

$ 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

但是,现在我不得不处理编译器给我的错误。为了获得一个工作程序,我必须对 Stroustrup 在 http://www.stroustrup.com/Programming/PPP2code/ 上提供的资源进行几处更改。

  1. 我在 Graph.h 上取消了对 std_lib_facilities.h 的注释
  2. 为了解决 Window 的歧义,我需要在 Simple_window.h 的第 9 行指定 Graph_lib::Window
  3. std_lib_facilities.h 在第 107 行和第 113 行使用 i<0 比较,当 i 是 未签名(但这些只是警告)。
  4. Graph.h 第 159 行使用 fl_color() 但编译器说它应该是 Fl_Color
  5. 我需要在 Point.h 中取消注释 Point 的构造函数
  6. Simple_window.h 的Simple_window.cpp 有几个重定义 在 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::run(); 这是我从附录 D 的例子中得到的,否则窗口会 不关闭它的关闭按钮。

通过所有这些更改,我终于有了它应该的窗口,并且可以使用 Next 按钮或所述窗口的关闭按钮关闭窗口(使用 wait_for_button 我需要在 Konsole 之后使用 Ctrl-c 结束程序我试着用窗口的关闭按钮关闭它)。

我希望下一个人不必花费我不得不花费的所有时间。

编辑: 好吧,检查我的系统和编译命令,我意识到有几 block 地毯重复了......而它们实际上不存在于我的 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

这些要容易得多(我几乎可以在每次需要时编写它们)

关于c++ - Stroustrup 的 Simple_window.h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7134049/

相关文章:

c++ - GDI+图像类问题

c++ - Windows 窗体中的 DirectX9

c++ - 解析位图文件时,如何替换WORD和DWORD数据类型?

c++ - type_info 对象存储在哪里?

c++ - 混合使用 DirectX 和 OpenGL

c - 如何避免 C 头文件覆盖 native C++ 类型

php - 在 PhpExcel codeigniter 中强制下载 excel 时显示未知字符

c++ - 如何用FLTK显示Unicode?

c++ - 如何用其他文件编译fltk文件?

octave 找不到 fltk XGetUtf8FontAndGlyph 符号