任何处于相同困境的人,我在这里留下了我所做的事情,最终能够编译并获取Stroustrup的书“Programming: Principles and Practice using C++, 2nd Edition”的第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/上提供的源代码进行多次更改。
- 我在Graph.h中取消了对std_lib_facilities.h的注释。
- 为了解决Window的歧义,我需要在Simple_window.h的第9行指定Graph_lib::Window。
- 当i是unsigned时,std_lib_facilities.h在第107和113行使用i<0比较(但这只是警告)。
- Graph.h的第159行使用了fl_color(),但编译器说应该是Fl_Color。
- 我需要在Point.h中取消Point构造函数的注释。
- 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在任何形式下都不起作用。
- 在GUI.cpp中,Menu的构造函数有另一个重新定义。我将其注释掉。
- 我更改了第12.3节示例的最后一行,从
win.wait_for_button;
到
Fl::run();
我从附录D的示例中获取了这个代码,因为否则窗口不会通过其关闭按钮关闭。
随着所有这些变化,我最终拥有了应该有的窗口,并且该窗口可以通过“下一个”按钮或该窗口的关闭按钮关闭(使用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
这些要简单得多(我几乎每次需要它们时都能写出来)
Simple_window::Simple_window(Point, int, int, String const&)
,你有在任何地方定义过吗? - Mooing DuckSimple_window
的构造函数提供定义,并且你在Graph_lib::Window
中有虚函数,但没有定义虚析构函数。也许你只是没有将所有正确的.o
文件链接在一起。这些事情与图形无关。 - Lightness Races in Orbit