CMake を使った自作ライブラリの作成

おはようございます.前回のエントリから2週間近く間が空いてしまい,,,若干デコミット気味になってしまいました.
作業の方は相変わらず手探りですが,

1. CMakeをつかったライブラリの作成.
2. ホワイトバランス調整のプログラム作成.
3. ステレオカメラを使ったOGMの作成.

の3つに取り組んでます.1に関しては,コードを作っていくうえで,ROSだとどうしても規模が大きくて(roscore, rviz立ち上げ等々...)デバッグしたりするのが面倒で,
まずは小さく作動するライブラリを作って,それをラップしてROSで使うことにしました.いまちょうど仕事の方でもソフトの整理的なことを少しやってまして,あとあと振り
返って使えるものにしたかったので,CMakeの使い方を少し勉強しました.

一応,下記のCMakeLists.txtに必要なものが全部入っているかと思います.(自分の使用用途範囲無いですが...)
あと,エディタにはEclipseを使っているんですが,ソースフォルダと並列にビルドフォルダを配置しないと行けないとのことで,下記のようなフォルダ構成にしました.


robotics_library
|
|-algo
  |-vision
     |-ground_estimation
      |-src
      |-include
      |-build

cmake_minimum_required(VERSION 2.8)
project(rosbag_reader)
include(CheckCXXCompilerFlag)
#set(CMAKE_BUILD_TYPE "Debug")

# Specify dll name
set(LIB_NAME "rosbag_reader")

# Specify Src for Library
# ライブラリのソースコード
set(LIB_SRC "rosbag_reader.cpp")

# Specify Header for Library
set(LIB_HEADER "rosbag_reader.h")

# Specify Src for Sample Exe (ライブラリの作成時のデバッグ用に,小さいテストプログラムを毎回作ってます.)
set(LIB_SAMPLE "main.cpp")

# Specify Library Type
set(LIB_TYPE "SHARED") (静的ライブラリ or 共有ライブラリ)

# Specify External Library
# (rosbag ファイル等にアクセスしてログを使いたい時があるのですが,catkinをつかうと複雑になってしまう気がして,,,必要なものだけ入れます.)
set(ROS_INCLUDE_DIRS "/opt/ros/kinetic/include") 
include_directories(${ROS_INCLUDE_DIRS})

set(ROS_LIB_DIRS "/opt/ros/kinetic/lib")
link_directories(${ROS_LIB_DIRS})

set(BOOST_INCLUDE_DIRS "/usr/include/boost/")
include_directories(${BOOST_INCLUDE_DIRS})

set(BOOST_LIB_DIRS "/usr/lib/x86_64-linux-gnu/")
link_directories(${BOOST_LIB_DIRS})

# Specify install place.
set(INSTALL_DIR "/home/koichi/workspace/koichi_robotics_lib/install")

# Option for Release Build.
set(CMAKE_CXX_FLAGS_RELEASE "-Wall -O2")

# Oprion for Debug Build.
set(CMAKE_CXX_FLAGS_DEBUG "-g")

if(${LIB_TYPE} MATCHES "STATIC")
  set(LIB_TYPE_ARC "ARCHIVE")
else()
  set(LIB_TYPE_ARC "LIBRARY")
endif()


# Set Build Type.
if(NOT_CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "Release")
  add_definitions(-DRelease)
  message(STATUS "Build type not specified. Defaulting to Release.")
endif(NOT_CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "")
message(CMAKE_BUILD_TYPE : "${CMAKE_BUILD_TYPE}")

if(${CMAKE_BUILD_TYPE} MATCHES "Release")
  message(Build Type (Release) : "${CMAKE_BUILD_TYPE}")
  add_definitions(-DRelease)
else(${CMAKE_BUILD_TYPE} MATCHES "Debug")
  message(Build Type (Debug) : "${CMAKE_BUILD_TYPE}")
  add_definitions(-DDebug)
endif()


# Check CXX compiler. Abort build if the build system does not support cxx11
CHECK_CXX_COMPILER_FLAG(-std=c++11 COMPILER_SUPPORTS_CXX11)
if(COMPILER_SUPPORTS_CXX11)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
else()
  message(FATAL_ERROR "${CMAKE_CXX_COMPILER} has no C++11 support. Build abort. Please check.")
endif()

# Register OpenCV Library.
# ビルド・ローカルインストールした OpenCV を使用.できるだけシステムへのインストールをしない方向でオープンソースを使ってます.
set(OpenCV_DIR "/home/koichi/workspace/reps/opencv-3.1.0/install/share/OpenCV/")
find_package(OpenCV)

message(CMAKE_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
# Build and generate lib
add_library(${LIB_NAME} ${LIB_TYPE} ${LIB_SRC})
target_include_directories("${LIB_NAME}" PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../include)
target_link_libraries("${LIB_NAME}" ${OpenCV_LIBS} rosbag rosbag_storage rostime)

# Build and generate exe file.
link_directories(${INSTALL_DIR}/lib)

add_executable("${LIB_NAME}_test" ${LIB_SAMPLE})
target_include_directories("${LIB_NAME}_test" PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../include ${INSTALL_DIR}/include)
target_link_libraries("${LIB_NAME}_test" ${OpenCV_LIBS} ${LIB_NAME} rosbag cv_bridge cpp_common roscpp_serialization)

# Specify Install Folder
# 以下,インストールフォルダへのライブラリ・ヘッダファイルのインストール.このフォルダに対して,ROSのラッパー作成時にリンクします.
install(TARGETS "${LIB_NAME}" ${LIB_TYPE_ARC} DESTINATION "${INSTALL_DIR}/lib")
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../include/${LIB_HEADER} DESTINATION "${INSTALL_DIR}/include")

ほんとに雑記になってしまいましたが,出勤時間が来たので(笑),ステレオカメラを使ったマップの作成は今晩か明日に!