我试图从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'
等
我觉得掌握图形将是一条漫长而艰难的道路-_-
答案 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/上提供的来源进行一些更改
通过所有这些更改,我终于得到了应该的窗口,并且窗口关闭了下一个按钮或所述窗口的关闭按钮(使用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
解决命名空间冲突将struct Simple_window : Window {
更改为
struct Simple_window : Graph_lib::Window {
Simple_window()转换为声明(删除定义)。
将wait_for_button()
从定义转换为声明(在while循环中注释掉整个def)并从void更改为bool以与Simple_window.cpp
中的定义一致。
将cb_next(...)
转为声明
将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&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)
此问题和修复的摘要对于使其在不同平台上工作也非常有用。实际更正的代码可供下载: