title: ROS C++ project "include" folder?
body: <p>I feel I don't understand how to set up an "include" directory in a C++ project for header files, and also how to include these headers in the <code>.cpp</code> files.</p>
  
  <p>I'm talking about a project in the context of a ROS package, but I don't think ROS would make the structure of the project any different.</p>
  
  <p>To be specific, this is the structure of the directory I'm talking about:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>So we see all the header files in the <code>./include/sdd_vio</code> folder.</p>
  
  <p>But in the <code>./src/vo_stereo_1.cpp</code> file, it includes a header file like this:</p>
  
  <pre><code>#include "sdd_vio/vo_stereo.h"
  </code></pre>
  
  <p>I feel it should use this instead:</p>
  
  <pre><code>#include "../include/sdd_vio/vo_stereo.h"
  </code></pre>
  
  <p>Why does it omit the <code>../include</code> part? </p>
  
  <p>Also, it would be good if there are good resources to help me learn about build / CMake / how to figure out the correct include path in general. I've read the official CMake tutorial, some tutorials on how compile + link actually work, but still feel my knowledge is not systematic... Thanks!</p>
  
  <p><strong>Edit</strong>
  Adding the CMakeLists.txt file below as mentioned in the answer.</p>
  
  <pre><code>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)
  </code></pre>