ROS C++项目"include"文件夹?



我觉得我不明白如何在C++项目中为头文件设置"include"目录,以及如何将这些头包含在.cpp文件中。

我说的是 ROS 包上下文中的项目,但我不认为 ROS 会使项目的结构有任何不同。

具体来说,这就是我正在谈论的目录的结构:

yuqiong@yuqiong-G7-7588:/media/yuqiong/DATA/sdd_vio$ tree
.
├── CMakeLists.txt
├── CMakeModules
│   └── FindEigen.cmake
├── config
│   ├── camchain-imucam-euroc.yaml
│   ├── camchain-imucam-fla1_11052016.yaml
│   ├── camchain-imucam-snapdragon.yaml
│   ├── custom_rosconsole.conf
│   ├── disp_vo_param.yaml
│   ├── ukf_params.yaml
│   └── vo_param.yaml
├── include
│   └── sdd_vio
│       ├── grid.h
│       ├── pinhole_camera_stereo.h
│       ├── sdd_vio_nodelet.h
│       ├── utils
│       │   ├── calib_utils.h
│       │   ├── math_utils.h
│       │   ├── ros_params_helper.h
│       │   └── timer.hpp
│       ├── visualization.h
│       └── vo_stereo.h
├── launch
│   ├── bag_reader.launch
│   ├── disp_nodelet.launch
│   ├── image_proc_rectify.launch
│   ├── imu.launch
│   ├── vins_node.launch
│   ├── vins_nodelet_euroc.launch
│   ├── vins_nodelet.launch
│   ├── vins_robot.launch
│   └── visualization.launch
├── LICENSE
├── nodelet_plugins.xml
├── package.xml
├── readme.md
├── rviz
│   ├── rviz_config_gs.rviz
│   └── rviz_config.rviz
├── src
│   ├── grid.cpp
│   ├── imu_integration_nodelet.cpp
│   ├── pinhole_camera_stereo.cpp
│   ├── sdd_vio_bag_reader.cpp
│   ├── sdd_vio_node.cpp
│   ├── sdd_vio_nodelet.cpp
│   ├── utils
│   │   ├── calib_utils.cpp
│   │   └── math_utils.cpp
│   ├── visualization.cpp
│   ├── vo_stereo_1.cpp
│   ├── vo_stereo_2.cpp
│   ├── vo_stereo_3.cpp
│   └── vo_stereo_4.cpp
└── statistics
9 directories, 47 files

所以我们在./include/sdd_vio文件夹中看到了所有的头文件。

但是在./src/vo_stereo_1.cpp文件中,它包含一个头文件,如下所示:

#include "sdd_vio/vo_stereo.h"

我觉得它应该改用这个:

#include "../include/sdd_vio/vo_stereo.h"

为什么省略../include部分?

另外,如果有好的资源可以帮助我了解构建/CMake/如何找出正确的包含路径,那就太好了。我看过CMake官方教程,一些关于编译+链接实际工作原理的教程,但还是觉得我的知识不系统......谢谢!

编辑添加下面的 CMakeLists.txt 文件,如答案中所述。

cmake_minimum_required(VERSION 2.8.3)
project(sdd_vio)
IF(DEFINED ENV{ARM_ARCHITECTURE})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -march=native -mfpu=neon")
#set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -Ofast -fno-signed-zeros -fno-math-errno -funroll-loops -fno-strict-aliasing")
ELSE()
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -Wall -std=c++11")
ENDIF()
# set default build type
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()

find_package(catkin REQUIRED COMPONENTS
roscpp
image_transport
sensor_msgs
cv_bridge
visualization_msgs
tf
nodelet
rosbag
)
FIND_PACKAGE(OpenCV 3 REQUIRED)
FIND_PACKAGE(Eigen3 REQUIRED)
find_package(Boost REQUIRED COMPONENTS thread)
#find_package(Ceres REQUIRED)

# Check if OpenCV package has been found
message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
# Check if Eigen package has been found
message(STATUS "Eigen library status:")
message(STATUS "    version: ${EIGEN3_VERSION}")
message(STATUS "    libraries: ${EIGEN3_LIBS}")
message(STATUS "    include path: ${EIGEN3_INCLUDE_DIRS}")
catkin_package(
LIBRARIES vo_nodelet imu_integration_nodelet
DEPENDS EIGEN3 OpenCV
CATKIN_DEPENDS roscpp image_transport sensor_msgs visualization_msgs tf nodelet
LIBRARIES sdd_vio_nodelet
)
INCLUDE_DIRECTORIES(
include
${EIGEN3_INCLUDE_DIR}
${catkin_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)
add_library(pinhole_camera src/pinhole_camera_stereo.cpp)
target_link_libraries(pinhole_camera ${catkin_LIBRARIES} ${Boost_LIBRARIES} ${OpenCV_LIBS} utils)
add_library(utils src/utils/math_utils.cpp src/utils/calib_utils.cpp)
target_link_libraries(utils ${OpenCV_LIBS} ${catkin_LIBRARIES})
add_library(vo src/vo_stereo_1.cpp src/vo_stereo_2.cpp src/vo_stereo_3.cpp src/vo_stereo_4.cpp src/grid.cpp)
# add_library(vo src/disp_vo_stereo.cpp src/grid.cpp)
target_link_libraries(vo utils pinhole_camera ${catkin_LIBRARIES} ${Boost_LIBRARIES} ${OpenCV_LIBS})  # ${CERES_LIBRARIES}

# for nodelet
add_library(vo_nodelet src/sdd_vio_nodelet.cpp src/visualization.cpp)
add_dependencies(vo_nodelet ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(vo_nodelet vo ${catkin_LIBRARIES} ${Boost_LIBRARIES})
add_library(imu_integration_nodelet src/imu_integration_nodelet.cpp)
add_dependencies(imu_integration_nodelet ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(imu_integration_nodelet ${catkin_LIBRARIES})

# for node
ADD_EXECUTABLE(sdd_vio_node src/sdd_vio_node.cpp src/visualization.cpp)
TARGET_LINK_LIBRARIES(
sdd_vio_node
pinhole_camera
vo
${OpenCV_LIBS}
${catkin_LIBRARIES}
)

add_executable(sdd_vio_bag_reader src/sdd_vio_bag_reader.cpp)
target_link_libraries(sdd_vio_bag_reader vo_nodelet)

为什么省略了 ../包括部分?

您的 CMakeLists.txt 文件中包含以下行:

INCLUDE_DIRECTORIES(
include
${EIGEN3_INCLUDE_DIR}
${catkin_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)

INCLUDE_DIRECTORIES告诉编译器在何处查找头文件。在这种情况下,其中一个位置是项目中的include目录,因此允许您省略../include部分。这也是更好的使用形式,因为将来使用绝对路径然后将包含 include 语句的.cpp文件移动到某个子文件夹可能会破坏代码。

如果有好的资源可以帮助我了解构建/CMake,那就太好

有几本关于Cmake的好书,比如Cmake CookBook。但是在这种情况下,由于您正在处理 ROS,我建议您从 ROS 教程开始,它们涵盖了您想知道的一些基础知识。

最新更新