Stroustrup';这是一个简单的窗口 我试图让图形例子从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(); }

Stroustrup';这是一个简单的窗口 我试图让图形例子从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(); },c++,header,fltk,C++,Header,Fltk,但这给了我更多我不明白的错误: $ 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 fu

但这给了我更多我不明白的错误:

$ 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'
等等


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

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

g++graph.cpp GUI.cpp Simple_window.cpp window.cpp


似乎更像是这样。但我没有这方面的实际经验。

托莫拉克,当你说这“取得了进展”时,我非常高兴。我不知道你是不是在挖苦人,但不管怎样

我已经解决了这个问题(或者至少我已经设法让一个窗口显示一个三角形)。然而,这只是在对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配置

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

Nathan

你的回答对我实现Stroustrup的简单三角形程序有很大帮助。我想在你的基础上发布我自己的解决方案。通过对Stroustrup的代码进行一次修改和一个大大扩展的编译脚本,我得到了三角形

g++-I/usr/localinclude-I/usr/local/include/FL/images-D_LARGEFILE\u SOURCE-D_FILE\u OFFSET\u BITS=64-D_THREAD\u SAFE-D_可重入-o'myimplementationofstrutrup.o''myimplementationofstrutrup.cpp''Simple_window.cpp''Graph.cpp''GUI.cpp''window.cpp'/usr/local/lib/lib/libfltk.a-线程-ldl-lm-11-L/usr/local/lib-ltk-lfltk_png-lfltk_z-lfltk_jpeg-lfltk

与您的不同之处如下:

1) 我不得不在我所有的.cpp文件中添加引号。。。系统差异,也许?
2) 我必须在末尾添加六个您没有使用的标志,否则我会出现更多“未定义引用”错误。

3) 由于一个不明确的引用错误,我不得不在Simple_Window.h的第17行指定“Graph_lib::Window”。这是我必须对Stroustrup的代码做出的唯一改变。

< P>对同一个处境的任何人,我离开这里,我终于可以在Stroustrup的书《编程:C++原理和实践,第二版》第12.3节中用FLTK编译并获得第一个程序的窗口。 在Kubuntu 14.04上安装FLTK后

$ sudo apt install libfltk1.3-dev
我可以使用

$ 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_图像和-std=c++11

然而,现在我不得不处理编译器给我的错误。为了得到一个有效的程序,我必须对Stroustrup提供的源代码做一些修改

  • 我在Graph.h上未注释std_lib_facilities.h
  • 为了解决Window的模糊性,我需要在Simple_Window.h的第9行指定Graph_lib::Window

  • 第107行和第113行的std_lib_facilities.h使用了一个i这个问题和修复的摘要对于让它在不同的平台上工作也非常有帮助。可下载实际更正的代码:


    在本书的论坛上,有一个非常详细的演练,介绍了如何在线程中解决此问题:

    基于此,我创建了一个github存储库,它实现了所有这些更改和其他更改,并包含了有关如何构建项目的详细信息:

    我花了大约两周的时间研究这个该死的问题,我的知识(主要是从别人那里获得的)真实地体现在代码中,并将不断更新。但这是堆栈溢出,因此就我对代码所做的更改而言,大多数都是在该论坛上找到的,但由于给出链接答案并不好,它们如下所示:

    简单窗口.h

  • 将命名空间冲突更改
    struct Simple\u window:window{
    解析为
    struct Simple\u window:Graph\u lib::window{

  • 简单窗口()转换为声明(删除定义)

  • wait_for_button()
    从定义转换为声明(在while循环中注释掉整个定义),并从void更改为bool,以与
    Simple_window.cpp中的定义一致

  • cbu下一步(…)
    转到声明

  • void next()
    转到声明

  • 图形.h
    1.取消注释
    #包括“std\u lib\u facilities.h”

    2.将
    fl\u颜色
    更改为
    fl\u颜色
    (~第159行)

    图表.cpp 1.将
    can_open
    替换为: bool can_打开(常量字符串和s) //检查名为s的文件是否存在,是否可以打开以进行读取 { 伊夫斯特拉
    $ 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
    
    $ 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
    
    Point(int xx, int yy) : x(xx), y(yy) { }    
    Point() :x(0), y(0) { }
    
    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