Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake with ROS软件包:未检测到头文件_C++_Cmake_Ros_Catkin - Fatal编程技术网

C++ CMake with ROS软件包:未检测到头文件

C++ CMake with ROS软件包:未检测到头文件,c++,cmake,ros,catkin,C++,Cmake,Ros,Catkin,我试图将我的代码组织成一种更加面向对象的风格,每个类都有自己的头文件和cpp文件。这是我在工作区包文件夹中的树 - CMakeLists.txt - include - - Master_Thread.h - - Entry.h - - ROS_Topic_Thread.h - src - - pcl_ros_init.cpp - - archive - - - pcl_ros_not_updated.cpp - - - pc_ros_old2.cpp - - - thread.cpp - -

我试图将我的代码组织成一种更加面向对象的风格,每个类都有自己的头文件和cpp文件。这是我在工作区包文件夹中的树

- CMakeLists.txt
- include
- - Master_Thread.h
- - Entry.h
- - ROS_Topic_Thread.h
- src
- - pcl_ros_init.cpp
- - archive
- - - pcl_ros_not_updated.cpp
- - - pc_ros_old2.cpp
- - - thread.cpp
- - - pcl_ros_old.cpp
- package.xml
我没有将类定义分别放在cpp文件中,我暂时将它们与主代码(pcl_ros_init.cpp)放在一起。我的类之间有一些轻微的依赖关系,例如Master_Thread类在其声明中使用ROS_Topic_Thread,现在,Cmake能够找到include文件,但在Master_Thread.h等头文件中,它无法找到ROS_Topic_Thread的类签名
pcl\u ros\u自定义/包含/主线程。h:38:36:错误:“ros\u主题线程”尚未声明

这是我的CMakeLists.txt

cmake_minimum_required(VERSION 3.0.2)
project(pcl_ros_custom)

find_package(catkin REQUIRED COMPONENTS
roscpp
pcl_conversions
pcl_ros)

catkin_package(
INCLUDE_DIRS
CATKIN_DEPENDS roscpp
           pcl_conversions
           pcl_ros
)

include_directories(
include
${catkin_INCLUDE_DIRS}/include/**
)

add_executable(pcl_ros_init src/pcl_ros_init.cpp)
target_link_libraries(pcl_ros_init 
            ${catkin_LIBRARIES} ${roslib_LIBRARIES} ${PCL_LIBRARIES} )
这是两个头文件

#ifndef MASTER_THREAD_H
#define MASTER_THREAD_H
#include <ros/ros.h>
#include <pcl_conversions/pcl_conversions.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <sensor_msgs/PointCloud2.h>

#include <thread>
#include <mutex>
#include <chrono>
#include <functional>
#include <utility>
#include <string>

//include custom classes
#include "ROS_Topic_Thread.h"
#include "ClusteringBenchmarkEntry.h"


namespace OCB
{
    class Master_Thread
{
    private:
    std::atomic<bool> mKillswitch;
    std::vector<sensor_msgs::PointCloud2ConstPtr> mMasterbuffer1, mMasterbuffer2, mMasterbuffer3, mMasterbuffer4, mMergedPointCloud2Ptr_buffer;
    public:
    Master_Thread();
    void transfer_to_master_buffer(ROS_Topic_Thread&t1,ROS_Topic_Thread&t2, ROS_Topic_Thread&t3, ROS_Topic_Thread&t4 );
    
    void process_buffer();
    void setkillswitch();
};

} 
#endif
\ifndef主线程\u H
#定义主线程
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
//包括自定义类
#包括“ROS\u Topic\u Thread.h”
#包括“ClusteringBenchmarkEntry.h”
名称空间OCB
{
类主线程
{
私人:
原子开关;
std::向量mMasterbuffer1、mMasterbuffer2、mMasterbuffer3、mMasterbuffer4、mMergedPointCloud2Ptr_缓冲区;
公众:
主螺纹();
无效传输到主缓冲区(ROS主题线程和t1、ROS主题线程和t2、ROS主题线程和t3、ROS主题线程和t4);
无效进程缓冲区();
void setkillswitch();
};
} 
#恩迪夫
\ifndef ROS\u主题\u线程\u H
#定义ROS\u主题\u线程\u H
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“Master_Thread.h”
#包括“ClusteringBenchmarkEntry.h”
名称空间OCB
{
类ROS\u主题\u线程
{
私人:
ros::订户mSub;
//话题
常量std::字符串mSUB_主题;
//缓冲区
std::向量mthread缓冲区;
std::互斥mMutex;
公众:
ROS_主题_线程()=删除;
ROS_主题_线程(ROS::NodeHandle*NodeHandle,const std::string&SUBTOPIC,clustering benchmarkentry*条目);
无效回调(常数传感器:PointCloud2ConstPtr和sub\ptr);
朋友级主线程;
};
}//命名空间关闭范围
#endif//for ROS\u主题\u线程\u H
我哪里做错了

编辑


是一个很好的链接,它清除了C++中的大多数头文件组织,在上面的答案中,帮助我使项目构建顺利进行。希望它能帮助阅读本文的人。

本质上,您不需要将任何一个标题包含在另一个标题中。这修正了通告的内容。 在ROS_Topic_Thread.h中,
friend类主线程已转发声明Master_线程,因此不需要Master_线程.h头。
在Master_-Thread.h中,您还可以向前声明
类ROS\u-Topic\u-Thread在主线程类声明之前,因为在
transfer\u to\u Master\u buffer
方法中只使用对ROS\u Topic\u Thread的引用

\ifndef主线程\u H
#定义主线程
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
//包括自定义类
#包括“ClusteringBenchmarkEntry.h”
名称空间OCB
{
类ROS_主题_线程;
类主线程
{
私人:
原子开关;
std::向量mMasterbuffer1、mMasterbuffer2、mMasterbuffer3、mMasterbuffer4、mMergedPointCloud2Ptr_缓冲区;
公众:
主螺纹();
无效传输到主缓冲区(ROS主题线程和t1、ROS主题线程和t2、ROS主题线程和t3、ROS主题线程和t4);
无效进程缓冲区();
void setkillswitch();
};
} 
#恩迪夫
\ifndef ROS\u主题\u线程\u H
#定义ROS\u主题\u线程\u H
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“ClusteringBenchmarkEntry.h”
名称空间OCB
{
类ROS\u主题\u线程
{
私人:
ros::订户mSub;
//话题
常量std::字符串mSUB_主题;
//缓冲区
std::向量mthread缓冲区;
std::互斥mMutex;
公众:
ROS_主题_线程()=删除;
ROS_主题_线程(ROS::NodeHandle*NodeHandle,const std::string&SUBTOPIC,clustering benchmarkentry*条目);
无效回调(常数传感器:PointCloud2ConstPtr和sub\ptr);
朋友级主线程;
};
}//命名空间关闭范围
#endif//for ROS\u主题\u线程\u H

本质上,您不需要将任何一个标题包含到另一个标题中。这修正了通告的内容。 在ROS_Topic_Thread.h中,
friend类主线程已转发声明Master_线程,因此不需要Master_线程.h头。
在Master_-Thread.h中,您还可以向前声明
类ROS\u-Topic\u-Thread在主线程类声明之前,因为在
transfer\u to\u Master\u buffer
方法中只使用对ROS\u Topic\u Thread的引用

\ifndef主线程\u H
#定义主线程
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
//包括自定义类
#包括“ClusteringBenchmarkEntry.h”
名称空间OCB
{
类ROS_主题_线程;
类主线程
{
私人:
原子开关;
std::向量mMasterbuffer1、mMasterbuffer2、mMasterbuffer3、mMasterbuffer4、mMergedPointCloud2Ptr_缓冲区;
公众:
主螺纹();
无效传输到主缓冲区(ROS主题线程和t1、ROS主题线程和t2、ROS主题线程和t3、ROS主题线程和t4);
无效进程缓冲区();
void setkillswitch();
};
} 
#恩迪夫
\ifndef ROS\u主题\u线程\u H
#定义ROS\u主题\u线程\u H
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“ClusteringBenchmarkEntry.h”
名称空间OCB
{
类ROS\u主题\u线程
{
私人:
ros::订户mSub;
//话题
常量std::字符串mSUB_主题;
#ifndef ROS_TOPIC_THREAD_H
#define ROS_TOPIC_THREAD_H

#include <ros/ros.h>
#include <pcl_conversions/pcl_conversions.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <sensor_msgs/PointCloud2.h>

#include <thread>
#include <mutex>
#include <chrono>
#include <functional>
#include <utility>
#include <string>


#include "Master_Thread.h"
#include "ClusteringBenchmarkEntry.h"

namespace OCB
{
class ROS_Topic_Thread
{
    private:
    ros::Subscriber mSub;

    // Topic
    const std::string mSUB_TOPIC;

    //buffer
    std::vector<sensor_msgs::PointCloud2ConstPtr> mThreadbuffer;
    
    std::mutex mMutex;

    public:
    ROS_Topic_Thread()= delete;
    ROS_Topic_Thread(ros::NodeHandle* nodehandle, const std::string& SUBTOPIC, ClusteringBenchmarkEntry* entry);
  
    void callback(const sensor_msgs::PointCloud2ConstPtr& sub_ptr);
    friend class Master_Thread;

};

} //namespace close scope

#endif //for ROS_TOPIC_THREAD_H