尽管成功构建了Eclipse Neon构建错误

时间:2016-12-23 14:29:26

标签: c++ eclipse cmake eclipse-cdt

我正在尝试使用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)
}

1 个答案:

答案 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 ++索引/更新所有文件

理想情况下,我会花点时间研究如何使预处理器正确处理生成的项目,但是我现在没有时间。我希望这会有所帮助。