如何修复 'Programmin principles and practice Using C++' 书中的 FLTK 头文件?
How to fix the FLTK header files from 'Programmin principles and practice Using C++' book?
我正在关注 "Programming principles and practice using C++" 并进入介绍 GUI 的第 12 章。但是我无法从书中获取自定义头文件。在尝试了几个专门为本书安装 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[=11=]CA@[=11=]CHA@[=11=]BIN@[=11=]BP@[=11=]JJAILANP@[=11=]L@[=11=]PPPPPPPP@[=11=]JNCMFGIA@[=11=]P@[=11=]OPMGAAAA@[=11=]BC@[=11=]GMAHIJGF@@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[=11=]CA@[=11=]CHA@[=11=]BIN@[=11=]BP@[=11=]JJAILANP@[=11=]L@[=11=]PPPPPPPP@[=11=]JNCMFGIA@[=11=]P@[=11=]OPMGAAAA@[=11=]BC@[=11=]GMAHIJGF@@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[=11=]CA@[=11=]CHA@[=11=]BIN@[=11=]BP@[=11=]JJAILANP@[=11=]L@[=11=]PPPPPPPP@[=11=]JNCMFGIA@[=11=]P@[=11=]OPMGAAAA@[=11=]BC@[=11=]GMAHIJGF@@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();
}
//------------------------------------------------------------------------------
有两个选项可以解决这个问题,虽然不知道,但通常哪个更好:
1) 注释掉第 218-228 行 "std_lib_facilities.h" 中的随机数生成器
或
2) 项目 - 属性 - 链接器 - 所有选项 - 其他选项 => 编辑并添加 /FORCE:MULTIPLE
两者都对我有用,希望对你也有用。
我正在关注 "Programming principles and practice using C++" 并进入介绍 GUI 的第 12 章。但是我无法从书中获取自定义头文件。在尝试了几个专门为本书安装 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[=11=]CA@[=11=]CHA@[=11=]BIN@[=11=]BP@[=11=]JJAILANP@[=11=]L@[=11=]PPPPPPPP@[=11=]JNCMFGIA@[=11=]P@[=11=]OPMGAAAA@[=11=]BC@[=11=]GMAHIJGF@@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[=11=]CA@[=11=]CHA@[=11=]BIN@[=11=]BP@[=11=]JJAILANP@[=11=]L@[=11=]PPPPPPPP@[=11=]JNCMFGIA@[=11=]P@[=11=]OPMGAAAA@[=11=]BC@[=11=]GMAHIJGF@@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[=11=]CA@[=11=]CHA@[=11=]BIN@[=11=]BP@[=11=]JJAILANP@[=11=]L@[=11=]PPPPPPPP@[=11=]JNCMFGIA@[=11=]P@[=11=]OPMGAAAA@[=11=]BC@[=11=]GMAHIJGF@@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();
}
//------------------------------------------------------------------------------
有两个选项可以解决这个问题,虽然不知道,但通常哪个更好:
1) 注释掉第 218-228 行 "std_lib_facilities.h" 中的随机数生成器
或
2) 项目 - 属性 - 链接器 - 所有选项 - 其他选项 => 编辑并添加 /FORCE:MULTIPLE
两者都对我有用,希望对你也有用。