Stroustrup的Simple_window.h

时间:2011-08-20 19:11:18

标签: 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'

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

6 个答案:

答案 0 :(得分:3)

对于处于同样困境的任何人,我离开这里,我最终能够编译并在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. 第107行和第113行的
  4. std_lib_facilities.h在i时使用i&lt; 0比较 无符号(但这些只是警告)。
  5. Graph.h第159行使用fl_color(),但编译器说它应该是Fl_Color
  6. 我需要取消注释Point in Point.h的构造函数。
  7. 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不起作用 无论是形式。
  8. 在GUI.cpp中,还有另一个重新定义Menu的构造函数。一世 评论出来了。
  9. 我更改了第12.3节示例的最后一行 从 win.wait_for_button; 至 FL ::的run(); 我从附录D中的示例中获取,因为否则窗口会这样做 没有关闭它的关闭按钮。
  10. 通过所有这些更改,我终于得到了应该的窗口,并且窗口关闭了下一个按钮或所述窗口的关闭按钮(使用wait_for_button我需要使用Ctrl-c从Konsole结束程序我试图用窗户的关闭按钮关闭它。

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

    编辑:好吧,检查我的系统和编译命令,我意识到有几个地毯重复......而且他们实际上并不存在于我的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 :(得分:1)

这与图形本身并没有任何关系。问题似乎是您只在命令行中包含了一个需要编译的源文件。从他的网站判断

  

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

似乎更喜欢它。但我没有这方面的实际经验。

答案 2 :(得分:1)

托莫拉克,当你说这个“取得了进展”时,我非常高兴。不知道你是不是在讽刺,不管是什么。

我已经解决了这个问题(或者至少我设法让一个窗口出现一个三角形)。然而,这只是在评论和编辑Stroustrup代码的大部分之后。我不觉得他的书非常适合初学者。我也不建议尝试使用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文件提供的shell脚本查看并放入/ usr / inc / bin。它叫做fltk-config。

另外,有用的提示是:从他们的网站下载fltk源代码,而不仅仅是Stroustrup网站上的FL代码。然后阅读自述文件并在完成本书附录D中的测试程序之前完全按照说明进行操作。然后尝试他的示例代码重复修复您找到的错误,直到它工作。 如果您认为我可以帮助或想知道我如何得到我的解决方案,请给我发电子邮件(但我是新手,所以不太可能有用)。

答案 3 :(得分:1)

森,

在我自己努力实施Stroustrup的简单三角程序时,你的回答对我非常有帮助。我想根据你自己发布我自己的解决方案。通过对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)我不得不在你没有使用的最后添加六个标志,否则我得到更多&#34;未定义的参考&#34;错误。
3)我必须指定&#34; Graph_lib :: Window&#34;在Simple_window.h的第17行,因为一个模糊的引用错误。这是我对Stroustrup代码所做的唯一改变。

答案 4 :(得分:0)

有一个非常详细的演练如何在书的论坛中解决这个问题:
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()从定义转换为声明(在while循环中注释掉整个def)并从void更改为bool以与Simple_window.cpp中的定义一致。

  4. cb_next(...)转为声明

  5. void next()转为声明

  6. <强> Graph.h
    1.取消注释#include "std_lib_facilities.h"
    2.将fl_color更改为Fl_Color(〜第159行)

    <强> Graph.cpp 1.将can_open替换为:     bool can_open(const string&amp; 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
    

    如果您使用cmake安装了fltk,那么您也可以使用cmake / make构建示例:存储库中有一个CMakeLists.txt文件。

答案 5 :(得分:-1)

此问题和修复的摘要对于使其在不同平台上工作也非常有用。实际更正的代码可供下载:

FLTK issue compiling - PPP2ndEd