我正在尝试使用Eclipse为涉及Gazebo(一种流行的机器人模拟器)的项目进行开发。 Gazebo提供了一个插件系统,允许与模拟器进行外部交互,以及一系列有关如何编写插件的教程。
成功地学习了教程后,我尝试将代码迁移到Eclipse,使用cmake -G“Eclipse CDT4 - Unix Makefiles”[buildpath]生成eclipse rpoject,然后将其导入Eclipse工作区。
一切都很顺利,但我遇到了一个有点奇怪的问题:
当我编译我的项目时,Eclipse返回“找不到成员声明”错误,引用了ModelPush :: Load函数签名中使用的SDFormat数据类型(参见下面的代码片段)。 SDFormat,incidnetally是一个机器人XML,用于描述机器人如何组合在一起。
尽管存在此错误(这应该导致无法构建任何内容),但无论如何都会构建生成的共享库。
我想我可以忍受它,但我显然想解决这个问题,这似乎是Eclipse / CDT的内部......
要澄清:
我正在尝试确定为什么Eclipse在model_push.cc
中的Load()函数签名上给出了错误:“找不到成员声明”。有罪方是sdf::ElementPtr _sdf
参数。 SDFormat库或者Eclipse / CDT看待它的方式有问题。这不是一个包含问题。而且,即使Eclipse给我错误,它仍然构建.so文件。从命令行运行make也会生成文件,但没有任何错误。
同样,我可以忍受它,但我不愿意。我只是不知道从哪里开始寻找解决方案,因为这不是查找包含或sdf库文件的问题。
这是类声明(mode_push.hh):
#ifndef MODEL_PUSH_HH_
#define MODEL_PUSH_HH_
#include <boost/bind.hpp>
#include <gazebo/gazebo.hh>
#include <gazebo/physics/physics.hh>
#include <gazebo/common/common.hh>
#include <stdio.h>
#include <sdf/sdf.hh>
namespace gazebo
{
class ModelPush : public ModelPlugin
{
public:
void Load (physics::ModelPtr _parent, sdf::ElementPtr _sdf);
//Called by the world update start event
void OnUpdate (const common::UpdateInfo & /*_info*/);
//Pointer to the model
private:
physics::ModelPtr model;
//Pointer to the update event connection
private:
event::ConnectionPtr updateConnection;
};
}
#endif /* MODEL_PUSH_HH_ */
这是实现文件(model_push.cc):
#include "model_push.hh"
namespace gazebo
{
void ModelPush::Load(physics::ModelPtr _parent, sdf::ElementPtr _sdf)
//void ModelPush::Load (physics::ModelPtr _parent, sdf::ElementPtr /*sdf*/)
{
//Store the pointer to the model
this -> model = _parent;
//Listen to the update event. This event is broadcast every
//simulation iteration.
this -> updateConnection = event::Events::ConnectWorldUpdateBegin(
boost::bind (&ModelPush::OnUpdate, this, _1));
}
//Called by the world update start event
void ModelPush::OnUpdate (const common::UpdateInfo & /*_info*/)
{
//Apply a small linear velocity to the model.
this -> model -> SetLinearVel (math::Vector3 (0.03, 0.0, 0.0));
}
//Register this plugin with the simulator
//GZ_REGISTER_MODEL_PLUGIN(ModelPush)
}
答案 0 :(得分:0)
我一直在努力解决这个确切的问题。我找到了可行的解决方案,但我仍然认为不是理想的解决方案。我不是使用cmake(或catkin_make)来生成eclipse项目,而是使用CDT项目构建器来生成它。这是我在Eclipse 2018-09中使用的过程。
创建类型为C ++托管版本(使用CDT托管版本系统的C ++项目版本)的新C / C ++项目。
项目名称:ROSWorkspace 位置:/ home /用户名/ eclipse-workspace / ROSWorkspace 项目类型:Makefile项目/空项目 工具链:Linux GCC
完成。
右键单击该项目,然后选择“属性”。
C / C ++构建/构建器指示: 取消选中“使用默认构建命令” 生成命令:catkin_make 构建目录:$ {workspace_loc:/../ catkin_ws} /
C / C ++常规/路径和符号/包含选项卡 添加/ usr / include / gazebo-8 添加/usr/include/sdformat-5.3
C / C ++常规/预处理器的“包含” /“提供程序”选项卡 CDT GCC内置编译器设置/命令以获取编译器规格:$ {COMMAND} $ {FLAGS} -E -P -v -dD“ $ {INPUTS}” -std = c ++ 11
单击确定,然后从下拉菜单中选择: 项目/ C / C ++索引/更新所有文件
理想情况下,我会花点时间研究如何使预处理器正确处理生成的项目,但是我现在没有时间。我希望这会有所帮助。