如何修复“Programmin 原则和实践使用 C++”一书中的 FLTK 头文件?

Posted

技术标签:

【中文标题】如何修复“Programmin 原则和实践使用 C++”一书中的 FLTK 头文件?【英文标题】:How to fix the FLTK header files from 'Programmin principles and practice Using C++' book? 【发布时间】:2019-05-12 14:14:41 【问题描述】:

我正在遵循“编程原则和使用 C++ 的实践”并进入第 12 章介绍 GUI。但是我无法从书中获取自定义头文件。在尝试了几个专门为这本书安装 fltk 的指南之后,我在这本指南中得到了最深入的了解:https://bumpyroadtocode.com/2017/08/05/how-to-install-and-use-fltk-1-3-4-in-visual-studio-2017-complete-guide/#comments

我对头文件进行了与他们所做的相同的更改,消除了大部分错误,但不是全部。注释掉 Simple_window.h 和 Simple_window.cpp 中的一些重复声明后,我只剩下 7 个错误。但由于我是 C++ 新手(否则我可能不会读这本书)我无法摆脱最后几个错误:(

这些是错误:

Severity    Code    Description Project File    Line    Suppression State
Error   LNK2005 "void __cdecl seed_randint(int)" (?seed_randint@@YAXH@Z) already defined in Graph.obj   Programming Principles and Practice Using C++   C:\Users\CM Storm i7\source\repos\Programming Principles and Practice Using C++\Programming Principles and Practice Using C++\Window.obj    1   
Error   LNK2005 "class std::mersenne_twister_engine<unsigned int,32,624,397,31,2567483615,11,4294967295,7,2636928640,15,4022730752,18,1812433253> & __cdecl get_rand(void)" (?get_rand@@YAAAV?$mersenne_twister_engine@I$0CA@$0CHA@$0BIN@$0BP@$0JJAILANP@$0L@$0PPPPPPPP@$06$0JNCMFGIA@$0P@$0OPMGAAAA@$0BC@$0GMAHIJGF@@std@@XZ) already defined in Graph.obj Programming Principles and Practice Using C++   C:\Users\CM Storm i7\source\repos\Programming Principles and Practice Using C++\Programming Principles and Practice Using C++\GUI.obj   1   
Error   LNK2005 "class std::mersenne_twister_engine<unsigned int,32,624,397,31,2567483615,11,4294967295,7,2636928640,15,4022730752,18,1812433253> & __cdecl get_rand(void)" (?get_rand@@YAAAV?$mersenne_twister_engine@I$0CA@$0CHA@$0BIN@$0BP@$0JJAILANP@$0L@$0PPPPPPPP@$06$0JNCMFGIA@$0P@$0OPMGAAAA@$0BC@$0GMAHIJGF@@std@@XZ) already defined in Graph.obj Programming Principles and Practice Using C++   C:\Users\CM Storm i7\source\repos\Programming Principles and Practice Using C++\Programming Principles and Practice Using C++\Simple_window.obj 1   
Error   LNK2005 "class std::mersenne_twister_engine<unsigned int,32,624,397,31,2567483615,11,4294967295,7,2636928640,15,4022730752,18,1812433253> & __cdecl get_rand(void)" (?get_rand@@YAAAV?$mersenne_twister_engine@I$0CA@$0CHA@$0BIN@$0BP@$0JJAILANP@$0L@$0PPPPPPPP@$06$0JNCMFGIA@$0P@$0OPMGAAAA@$0BC@$0GMAHIJGF@@std@@XZ) already defined in Graph.obj Programming Principles and Practice Using C++   C:\Users\CM Storm i7\source\repos\Programming Principles and Practice Using C++\Programming Principles and Practice Using C++\Window.obj    1   
Error   LNK2005 "void __cdecl seed_randint(int)" (?seed_randint@@YAXH@Z) already defined in Graph.obj   Programming Principles and Practice Using C++   C:\Users\CM Storm i7\source\repos\Programming Principles and Practice Using C++\Programming Principles and Practice Using C++\GUI.obj   1   
Error   LNK2005 "void __cdecl seed_randint(int)" (?seed_randint@@YAXH@Z) already defined in Graph.obj   Programming Principles and Practice Using C++   C:\Users\CM Storm i7\source\repos\Programming Principles and Practice Using C++\Programming Principles and Practice Using C++\Simple_window.obj 1   
Error   LNK1169 one or more multiply defined symbols found  Programming Principles and Practice Using C++   C:\Users\CM Storm i7\source\repos\Programming Principles and Practice Using C++\Debug\Programming Principles and Practice Using C++.exe 1   

这是 Simple_window.h:

#include "GUI.h"    // for Simple_window only (doesn't really belong in Window.h)

using namespace Graph_lib;

// Simple_window is basic scaffolding for ultra-simple interaction with graphics
// it provides one window with one "next" button for ultra-simple animation

struct Simple_window : Graph_lib::Window 
    Simple_window(Point xy, int w, int h, const string& title);

    /*
        : Window(xy, w, h, title),
        button_pushed(false),
        next_button(Point(x_max() - 70, 0), 70, 20, "Next", cb_next) 
        attach(next_button);
    
    */
    bool wait_for_button();
        // modified event loop
        // handle all events (as per default), but quit when button_pushed becomes true
        // this allows graphics without control inversion
    /*
    
        while (!button_pushed) Fl::wait();
        button_pushed = false;
        Fl::redraw();
    
    */
    Button next_button;
private:
    bool button_pushed;

    static void cb_next(Address, Address addr); // callback for next_button
    //   reference_to<Simple_window>(addr).next(); 
    /*
    
        static_cast<Simple_window*>(addr)->next();
    
    */
    void next(); // button_pushed = true; 

;

最后是 Simple_window.cpp:


//
// This is a GUI support code to the chapters 12-16 of the book
// "Programming -- Principles and Practice Using C++" by Bjarne Stroustrup
//

#include "Simple_window.h"

//------------------------------------------------------------------------------

Simple_window::Simple_window(Point xy, int w, int h, const string& title) :
    Window(xy, w, h, title),
    next_button(Point(x_max() - 70, 0), 70, 20, "Next", cb_next),
    button_pushed(false)

    attach(next_button);


//------------------------------------------------------------------------------

bool Simple_window::wait_for_button()
// modified event loop:
// handle all events (as per default), quit when button_pushed becomes true
// this allows graphics without control inversion

    show();
    button_pushed = false;
#if 1
    // Simpler handler
    while (!button_pushed) Fl::wait();
    Fl::redraw();
#else
    // To handle the case where the user presses the X button in the window frame
    // to kill the application, change the condition to 0 to enable this branch.
    Fl::run();
#endif
    return button_pushed;


//------------------------------------------------------------------------------

void Simple_window::cb_next(Address, Address pw)
// call Simple_window::next() for the window located at pw

    reference_to<Simple_window>(pw).next();


//------------------------------------------------------------------------------

void Simple_window::next()

    button_pushed = true;
    hide();


//------------------------------------------------------------------------------

【问题讨论】:

这与 FLTK 无关。您缺少定义 randint 和 std::mersenne_twister_engine 的库 【参考方案1】:

有两种方法可以解决这个问题,虽然不知道,但一般来说哪个更好:

1) 注释掉“std_lib_facilities.h”第 218-228 行中的随机数生成器

2) 项目 - 属性 - 链接器 - 所有选项 - 附加选项 => 编辑并添加 /FORCE:MULTIPLE

两者都对我有用,希望对你也有用。

【讨论】:

以上是关于如何修复“Programmin 原则和实践使用 C++”一书中的 FLTK 头文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复漏洞

如何修复WMI

PHP网站漏洞怎么修复 如何修补网站程序代码漏洞

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)

如何修复AppScan漏洞

如何在DOS环境下修复系统