ルンバを直進させながら,自己位置を表示させるプログラムを作成したのですが,下記のようになってしまいます.
おそらくヘッダーファイルの内容を変更すれば動くと思うのですが,どういじればいいのか自分なりに調べやっていたのですが
解決できず,皆様の力をお借りしたくトピックとして投稿します.
アドバイスの方,よろしくお願いします.
エラー一覧
エラー 16 error LNK2019: 未解決の外部シンボル _SDL_main が関数 _main_utf8 で参照されました。 D:\Project_VC\ROOMBA_ver2.02\SDL2main.lib(SDL_windows_main.obj) ROOMBA_ver2.02
エラー 12 error LNK2019: 未解決の外部シンボル "void __cdecl print_mm_position(class hrk::PositionF const &)" (?print_mm_position@@YAXABVPositionF@hrk@@@Z) が関数 _main で参照されました。 D:\Project_VC\ROOMBA_ver2.02\print_position.obj ROOMBA_ver2.02
エラー 11 error LNK2019: 未解決の外部シンボル "void __cdecl hrk::wait_stable(class hrk::Run_driver &,double,double)" (?wait_stable@hrk@@YAXAAVRun_driver@1@NN@Z) が関数 _main で参照されました。 D:\Project_VC\ROOMBA_ver2.02\print_position.obj ROOMBA_ver2.02
エラー 14 error LNK2019: 未解決の外部シンボル "void __cdecl hrk::delay(double)" (?delay@hrk@@YAXN@Z) が関数 _main で参照されました。 D:\Project_VC\ROOMBA_ver2.02\print_position.obj ROOMBA_ver2.02
エラー 10 error LNK2019: 未解決の外部シンボル "public: virtual void __thiscall hrk::Roomba_driver::stop(void)" (?stop@Roomba_driver@hrk@@UAEXXZ) が関数 _main で参照されました。 D:\Project_VC\ROOMBA_ver2.02\print_position.obj ROOMBA_ver2.02
エラー 9 error LNK2019: 未解決の外部シンボル "public: virtual void __thiscall hrk::Roomba_driver::follow_line(class hrk::PositionF const &,class hrk::Locatable const *)" (?follow_line@Roomba_driver@hrk@@UAEXABVPositionF@2@PBVLocatable@2@@Z) が関数 _main で参照されました。 D:\Project_VC\ROOMBA_ver2.02\print_position.obj ROOMBA_ver2.02
エラー 8 error LNK2019: 未解決の外部シンボル "public: virtual class hrk::PositionF __thiscall hrk::Roomba_driver::position(class hrk::Locatable const *)const " (?position@Roomba_driver@hrk@@UBE?AVPositionF@2@PBVLocatable@2@@Z) が関数 _main で参照されました。 D:\Project_VC\ROOMBA_ver2.02\print_position.obj ROOMBA_ver2.02
エラー 6 error LNK2019: 未解決の外部シンボル "public: virtual char const * __thiscall hrk::Roomba_driver::what(void)const " (?what@Roomba_driver@hrk@@UBEPBDXZ) が関数 _main で参照されました。 D:\Project_VC\ROOMBA_ver2.02\print_position.obj ROOMBA_ver2.02
エラー 5 error LNK2019: 未解決の外部シンボル "public: virtual __thiscall hrk::Roomba_driver::~Roomba_driver(void)" (??1Roomba_driver@hrk@@UAE@XZ) が関数 _main で参照されました。 D:\Project_VC\ROOMBA_ver2.02\print_position.obj ROOMBA_ver2.02
エラー 7 error LNK2019: 未解決の外部シンボル "public: bool __thiscall hrk::Roomba_driver::open(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,bool)" (?open@Roomba_driver@hrk@@QAE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@_N@Z) が関数 _main で参照されました。 D:\Project_VC\ROOMBA_ver2.02\print_position.obj ROOMBA_ver2.02
エラー 4 error LNK2019: 未解決の外部シンボル "public: __thiscall hrk::Roomba_driver::Roomba_driver(void)" (??0Roomba_driver@hrk@@QAE@XZ) が関数 _main で参照されました。 D:\Project_VC\ROOMBA_ver2.02\print_position.obj ROOMBA_ver2.02
エラー 3 error LNK2019: 未解決の外部シンボル "public: __thiscall hrk::PositionF::PositionF(double,double,class hrk::Angle const &)" (??0PositionF@hrk@@QAE@NNABVAngle@1@@Z) が関数 _main で参照されました。 D:\Project_VC\ROOMBA_ver2.02\print_position.obj ROOMBA_ver2.02
エラー 13 error LNK2019: 未解決の外部シンボル "double __cdecl hrk::ticks(void)" (?ticks@hrk@@YANXZ) が関数 _main で参照されました。 D:\Project_VC\ROOMBA_ver2.02\print_position.obj ROOMBA_ver2.02
エラー 2 error LNK2019: 未解決の外部シンボル "class hrk::Angle __cdecl hrk::deg(double)" (?deg@hrk@@YA?AVAngle@1@N@Z) が関数 _main で参照されました。 D:\Project_VC\ROOMBA_ver2.02\print_position.obj ROOMBA_ver2.02
エラー 1 error LNK2005: _main は既に print_position.obj で定義されています。 D:\Project_VC\ROOMBA_ver2.02\SDL2main.lib(SDL_windows_main.obj) ROOMBA_ver2.02
エラー 15 error LNK2001: 外部シンボル ""public: static class hrk::Coordinate * hrk::Run_driver::Global" (?Global@Run_driver@hrk@@2PAVCoordinate@2@A)" は未解決です。 D:\Project_VC\ROOMBA_ver2.02\print_position.obj ROOMBA_ver2.02
エラー 17 error LNK1120: 15 件の未解決の外部参照 D:\Project_VC\ROOMBA_ver2.02\Debug\ROOMBA_ver2.02.exe ROOMBA_ver2.02
未解決の外部シンボル
Re: 未解決の外部シンボル
ヘッダーファイルが多いので,ソースファイルと別々に投稿します.
環境は,windows8.1でVisual Studio2013です.
ヘッダーファイル
Angle.h
Coordinate.h
delay.h
Locatable.h
log_printf.h
PointF.h
PositionF.h
Power_manager.h
print_mm_position.h
robot_utils.h
Roomba_driver.h
Run_driver.h
ticks.h
環境は,windows8.1でVisual Studio2013です.
ヘッダーファイル
Angle.h
#ifndef HRK_ANGLE_H
#define HRK_ANGLE_H
namespace hrk
{
class Angle
{
friend Angle deg(double degree);
friend Angle rad(double radian);
public:
Angle(void);
double to_deg(void) const;
void set_deg(double degree);
double to_rad(void) const;
void set_rad(double radian);
bool operator != (const Angle& rhs) const;
bool operator == (const Angle& rhs) const;
Angle& operator += (const Angle& rhs);
const Angle operator + (const Angle& rhs) const;
Angle& operator -= (const Angle& rhs);
const Angle operator - (const Angle& rhs) const;
Angle operator - (void) const;
Angle& operator *= (const double rhs);
Angle operator * (const double rhs) const;
friend const Angle operator * (const double lhs, const Angle& rhs);
private:
double radian_;
};
extern Angle deg(double degree);
extern Angle rad(double radian);
}
#endif[/size][/size]
#ifndef HRK_COORDINATE_H
#define HRK_COORDINATE_H
#include <memory>
#include "Locatable.h"
namespace hrk
{
class Coordinate : public Locatable
{
public:
Coordinate();
explicit Coordinate(const PositionF& position,
const Locatable* coordinate = NULL);
~Coordinate();
PositionF position(const Locatable* coordinate = NULL) const;
void set_position(const PositionF& position,
const Locatable* coordinate = NULL);
//void set_parent(const PositionF& position, const Locatable* coordinate);
private:
Coordinate(const Coordinate& rhs);
Coordinate& operator = (const Coordinate& rhs);
struct pImpl;
std::auto_ptr<pImpl> pimpl;
};
}
#endif
#ifndef HRK_LOCATABLE_H
#define HRK_LOCATABLE_H
#include <cstddef>
#include "PositionF.h"
namespace hrk
{
class Locatable
{
public:
virtual ~Locatable()
{
}
virtual PositionF
position(const Locatable* coordinate = NULL) const = 0;
virtual void set_position(const PositionF& position,
const Locatable* coordinate = NULL) = 0;
};
}
#endif
#ifndef HRK_LOG_PRINTF_H
#define HRK_LOG_PRINTF_H
#include <string>
namespace hrk
{
#define FILE_POSITION() LOG_PRINTF_FILE_LINE(__FILE__, __LINE__)
#define LOG_PRINTF_FILE_LINE(file, line) file ":" LOG_PRINTF_VALUE(line) ":"
#define LOG_PRINTF_VALUE(value) #value
#define ASSERT(a, b) assert(a && b)
extern void log_set_file_name(const char* file_name);
extern bool log_is_valid();
extern int log_printf(const char* format, ...);
extern int log_print(const char* text);
extern size_t log_write(const char* buf, size_t count);
extern void log_printf_close();
}
#endif
#ifndef HRK_POINT_F_H
#define HRK_POINT_F_H
namespace hrk
{
class PointF
{
public:
PointF(void);
PointF(double x, double y);
double x(void) const;
double y(void) const;
void set_x(double x);
void set_y(double y);
bool operator != (const PointF& rhs) const;
bool operator == (const PointF& rhs) const;
bool operator < (const PointF& rhs) const;
PointF& operator += (const PointF& rhs);
const PointF operator + (const PointF& rhs) const;
PointF& operator -= (const PointF& rhs);
const PointF operator - (const PointF& rhs) const;
PointF& operator *= (const double rhs);
const PointF operator * (const double rhs);
private:
double x_;
double y_;
};
}
#endif
#ifndef HRK_POSITION_F_H
#define HRK_POSITION_F_H
#include "Angle.h"
#include "PointF.h"
namespace hrk
{
class PositionF
{
public:
PositionF(void);
PositionF(double x, double y, const Angle& angle);
PositionF(const PointF& point, const Angle& angle);
PositionF(const PointF& point);
double x(void) const;
double y(void) const;
PointF point(void) const;
Angle angle(void) const;
void set_x(double x);
void set_y(double y);
void set_angle(const Angle& angle);
bool operator != (const PositionF& rhs) const;
bool operator == (const PositionF& rhs) const;
PositionF& operator += (const PositionF& rhs);
PositionF& operator -= (const PositionF& rhs);
const PositionF operator + (const PositionF& rhs) const;
const PositionF operator - (const PositionF& rhs) const;
private:
double x_;
double y_;
Angle angle_;
};
}
#endif
#ifndef HRK_POWER_MANAGER_H
#define HRK_POWER_MANAGER_H
namespace hrk
{
class Power_manager
{
public:
enum {
Unknown = -1,
};
virtual ~Power_manager()
{
}
virtual bool sleep() = 0;
virtual bool wake_up() = 0;
virtual bool power_down() = 0;
virtual bool dock() = 0;
virtual bool is_charging() = 0;
virtual int charged_percent() = 0;
};
}
#endif
#ifndef PRINT_MM_POSITION_H
#define PRINT_MM_POSITION_H
namespace hrk
{
class PositionF;
}
extern void print_mm_position(const hrk::PositionF& position);
#endif
#ifndef HRK_ROBOT_UTILS_H
#define HRK_ROBOT_UTILS_H
namespace hrk
{
class Run_driver;
void wait_stable(Run_driver& robot,
double interval_wait, double timeout = -1.0);
}
#endif
#ifndef HRK_ROOMBA_DRIVER_H
#define HRK_ROOMBA_DRIVER_H
#include "Run_driver.h"
#include "Power_manager.h"
#include <string>
namespace hrk
{
class Roomba_driver : public Run_driver, public Power_manager
{
public:
Roomba_driver();
~Roomba_driver();
const char* what() const;
bool open(const std::string& device_name, bool do_open = true);
void close();
Connection* connection();
void set_connection(Connection* connection);
void set_straight_velocity(double m_per_sec);
double straight_velocity() const;
void set_rotate_velocity(const Angle& angle_per_sec);
Angle rotate_velocity() const;
void set_straight_acceleration(double m_per_sec2);
void set_rotate_acceleration(const Angle& angle_per_sec2);
PositionF position(const Locatable* coordinate = Global) const;
void set_position(const PositionF& position,
const Locatable* coordinate = Global);
double path_change_distance();
bool is_stable();
void follow_line(const PositionF& line,
const Locatable* coordinate = Global);
void follow_circle(const PointF& center, double radius,
const Locatable* coordinate = Global);
void stop_to_line(const PositionF& line,
const Locatable* coordinate = Global);
void spin(const Angle& spin_angle);
void spin_to_direction(const Angle& target_angle,
const Locatable* coordinate = Global);
void stop();
double distance_to(const PointF& point,
const Locatable* coordinate = Global);
double distance_to_perpendicular(const PositionF& line,
const Locatable* coordinate = Global);
Angle angle_to(const Angle& angle,
const Locatable* coordinate = Global);
bool sleep();
bool wake_up();
bool power_down();
bool dock();
bool is_charging();
int charged_percent();
void set_vacuum(bool on = true);
void control_wheel_velocity(double right_m_per_sec,
double left_m_per_sec);
private:
Roomba_driver(const Roomba_driver& rhs);
Roomba_driver& operator = (const Roomba_driver& rhs);
struct pImpl;
std::auto_ptr<pImpl> pimpl;
};
}
#endif
#ifndef HRK_RUN_DRIVER_H
#define HRK_RUN_DRIVER_H
#include "Coordinate.h"
namespace hrk
{
class Connection;
class Run_driver : public Locatable
{
public:
static Coordinate* Global;
virtual ~Run_driver()
{
}
virtual const char* what() const = 0;
virtual void close() = 0;
virtual void set_connection(Connection* connection) = 0;
virtual Connection* connection() = 0;
virtual void set_straight_velocity(double m_per_sec) = 0;
virtual double straight_velocity() const = 0;
virtual void set_rotate_velocity(const Angle& angle_per_sec) = 0;
virtual Angle rotate_velocity() const = 0;
virtual void set_straight_acceleration(double m_per_sec2) = 0;
virtual void set_rotate_acceleration(const Angle& angle_per_sec2) = 0;
virtual PositionF
position(const Locatable* coordinate = Global) const = 0;
virtual void set_position(const PositionF& position,
const Locatable* coordinate = Global) = 0;
virtual double path_change_distance() = 0;
virtual bool is_stable() = 0;
virtual void follow_line(const PositionF& line,
const Locatable* coordinate = Global) = 0;
virtual void follow_circle(const PointF& center, double radius,
const Locatable* coordinate = Global) = 0;
virtual void stop_to_line(const PositionF& line,
const Locatable* coordinate = Global) = 0;
virtual void spin(const Angle& spin_angle) = 0;
virtual void
spin_to_direction(const Angle& target_angle,
const Locatable* coordinate = Global) = 0;
virtual void stop() = 0;
virtual double distance_to(const PointF& point,
const Locatable* coordinate = Global) = 0;
virtual double
distance_to_perpendicular(const PositionF& line,
const Locatable* coordinate = Global) = 0;
virtual Angle angle_to(const Angle& angle,
const Locatable* coordinate = Global) = 0;
};
}
#endif
Re: 未解決の外部シンボル
最後に,ソースファイルです.
長くなってしまい,見づらいと思いますが,ご了承ください.
ソースファイル
print_position.cpp
長くなってしまい,見づらいと思いますが,ご了承ください.
ソースファイル
print_position.cpp
#include <iostream>
#include "Roomba_driver.h"
#include "robot_utils.h"
#include "print_mm_position.h"
#include "ticks.h"
#include "delay.h"
#include "log_printf.h"
using namespace hrk;
using namespace std;
int main(int argc, char *argv[])
{
static_cast<void>(argc);
static_cast<void>(argv);
Roomba_driver robot;
if (!robot.open("/dev/ttyUSB")) {
cerr << FILE_POSITION() << robot.what() << endl;
return 1;
}
// 移動の開始
robot.follow_line(PositionF(0, 0, deg(0)));
// しばらく位置を表示してから停止させる
const double Print_period_sec = 2.0;
const double first_sec = ticks();
while ((ticks() - first_sec) < Print_period_sec) {
print_mm_position(robot.position());
delay(0.1);
}
robot.stop();
wait_stable(robot, 0.1);
print_mm_position(robot.position());
return 0;
}