未解決の外部シンボル

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ルンバの操作をC++で

未解決の外部シンボル

#1

投稿記事 by ルンバの操作をC++で » 9年前

ルンバを直進させながら,自己位置を表示させるプログラムを作成したのですが,下記のようになってしまいます.
おそらくヘッダーファイルの内容を変更すれば動くと思うのですが,どういじればいいのか自分なりに調べやっていたのですが
解決できず,皆様の力をお借りしたくトピックとして投稿します.
アドバイスの方,よろしくお願いします.

エラー一覧
エラー 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

ルンバの操作をC++で

Re: 未解決の外部シンボル

#2

投稿記事 by ルンバの操作をC++で » 9年前

ヘッダーファイルが多いので,ソースファイルと別々に投稿します.
環境は,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]
Coordinate.h

コード:

#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
delay.h

コード:

#ifndef HRK_DELAY_H
#define HRK_DELAY_H

namespace hrk
{
	void delay(double sec);
}

#endif
Locatable.h

コード:

#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
log_printf.h

コード:

#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
PointF.h

コード:

#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
PositionF.h

コード:

#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
Power_manager.h

コード:

#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
print_mm_position.h

コード:

#ifndef PRINT_MM_POSITION_H
#define PRINT_MM_POSITION_H

namespace hrk
{
	class PositionF;
}


extern void print_mm_position(const hrk::PositionF& position);

#endif
robot_utils.h

コード:

#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
Roomba_driver.h

コード:

#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
Run_driver.h

コード:

#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
ticks.h

コード:

#ifndef HRK_TICKS_H
#define HRK_TICKS_H

namespace hrk
{
	double ticks();
	
	double system_ticks();
}

#endif

ルンバの操作をC++で

Re: 未解決の外部シンボル

#3

投稿記事 by ルンバの操作をC++で » 9年前

最後に,ソースファイルです.
長くなってしまい,見づらいと思いますが,ご了承ください.

ソースファイル
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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る