背景:
CMake这个东西,又爱又恨,第二次困在这个地方了。索性写篇博客,自己也好好总结一下。
参考网址:http://blog.csdn.net/wokaowokaowokao12345/article/details/50414468
ROS 官网:http://wiki.ros.org/catkin/CMakeLists.txt
1. 简单的利用CMakeLists.txt来自动编译程序
我们的程序源文件为main.cpp。放在目录CMake_learning/src下
#include<iostream>
int main()
{
std::cout<<"Hello world!"<<std::endl;
return 0;
}
为了编译该程序,我们的CMakeLists.txt如下
project(main)
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
aux_source_directory(./src DIR_SRCS)
add_executable(main ${DIR_SRCS})
第三行将当前目录所有的源文件都赋值给了DIR_SRCS。一般三、四行直接合并为一句
add_executable(main src/main.cpp)
建立一个名为build的文件夹
整个程序的目录结构如下
然后进入build文件夹,cmake .. 然后make
2. 程序链接自己创建的库
在src目录下新建两个文件,一个是hello_world.h
#ifndef __HELLO_WORLD_H
#define __HELLO_WORLD_H
void say_hello();
#endif
另一个是hello_world.cpp
#include <iostream>
void say_hello()
{
std::cout<<"Hello Yake!"<<std::endl;
}
main.cpp修改如下
#include"hello_world.h"
int main()
{
say_hello();
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(main_with_lib)
# Define a library target called hello_world
add_library(hello_world src/hello_world.cpp)
add_executable(main_with_lib src/main.cpp)
target_link_libraries(main_with_lib hello_world )
整个目录结构如下:
运行结果如下
要注意的是生成了一个链接库libhello_world.a
更详细的参考:http://www.hahack.com/codes/cmake/ 徐保来推荐,这个不错
https://github.com/ros-perception/perception_pcl/blob/hydro-devel/pcl_ros/CMakeLists.txt
catkin_package(
INCLUDE_DIRS include
LIBRARIES
pcl_ros_filters
pcl_ros_io
pcl_ros_tf
CATKIN_DEPENDS
dynamic_reconfigure
message_filters
nodelet
pcl_conversions
pcl_msgs
rosbag
roscpp
sensor_msgs
std_msgs
tf
DEPENDS
Boost
Eigen
PCL
)
~/catkin_ws/devel/lib/openni_4topic$LD_LIBRARY_PATH=/home/yake/src/opencv-3.3.1/yake_opencv331_installed/lib ./kinect_topic4_test
=============关于opencv3 关于cv_bridge==============
https://github.com/ros-perception/vision_opencv/issues/91
查看版本
pkg-config --modversion opencv
查看链接的库文件
pkg-config -cflags --libs opencv
关于安装的时候的环境变量(检查一下)
sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
只使用特定版本的opencv
FIND_PACKAGE(OpenCV 2.4.8 EXACT REQUIRED)
===============opencv2和opencv3共存================
1,下载OpenCV2.4.9,make install 路径为”~/Downloads/opencv2.4.9”
2,下载OpenCV3.0,make install 路径为”/usr/local”
3,需要使用OpenCV2.4.9的工程中,CMakeLists.txt如下:
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(opencv-test)
set(CMAKE_PREFIX_PATH "/home/fangli/Downloads/opencv2.4.9/")
find_package(OpenCV 2.4.9 EXACT REQUIRED)
add_executable(${PROJECT_NAME} main.cpp )
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
4,使用OpenCV3.x时,因为OpenCV3.x安装到了系统目录/usr/local中
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(opencv-test)
find_package(OpenCV REQUIRED)
add_executable(${PROJECT_NAME} main.cpp )
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
#/home/yake/src/opencv_3.2.0/yake_opencv320_installed/share/OpenCV/OpenCVConfig.cmake
SET(OpenCV_DIR /home/yake/src/opencv_3.2.0/yake_opencv320_installed/share/OpenCV)
find_package(OpenCV 3.2.0 EXACT REQUIRED )
IF ( OPENCV_FOUND )
#include_directories(${OpenCV_INCLUDE_DIRS} /home/yake/src/opencv_3.2.0/yake_opencv320_installed/include)
#include_directories(${OpenCV_LIBS} /home/yake/src/opencv_3.2.0/yake_opencv320_installed/lib)
message("OpenCV path dir = ${OpenCV_INCLUDE_DIRS}")
message("OpenCV path dir = ${OpenCV_VERSION}")
message("OpenCV path dir = ${OPENCV_LIBS}")
message("OpenCV path dir = ${OpenCV_INSTALL_PATH}")
message("OpenCV path dir = ${OpenCV_DIR}")
ENDIF ( OPENCV_FOUND )
https://cmake.org/cmake/help/v3.6/command/find_package.html#command:find_package
find_package(<package> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[NO_POLICY_SCOPE])
==============放在catkin前面==================
/opt/ros/hydro/share/cv_bridge/cmake/cv_bridgeConfig.cmake
https://github.com/ros-perception/vision_opencv/issues/91
将opencv的头文件放在catkin include前面。
find_package(OpenCV 2.4.8 EXACT REQUIRED)
include_directories(
include
${OpenCV_INCLUDE_DIRS} # /usr/include/opencv;/usr/include
${catkin_INCLUDE_DIRS} # contains /opt/ros/indigo/include
# ...other include directories
)
=================Unset=================
https://answers.ros.org/question/214043/use-ros-indigo-opencv3-alongside-248/
https://answers.ros.org/question/213925/opencv30-ros-indigo/
# don't use opencv as found by any prior running of find_package
unset(OpenCV_CONFIG_PATH CACHE)
unset(OpenCV_DIR CACHE)
set(TMP_PREFIX_PATH ${CMAKE_PREFIX_PATH})
set(CMAKE_PREFIX_PATH "$ENV{HOME}/special/install")
find_package(OpenCV 3.0 REQUIRED)
# restore CMAKE_PREFIX_PATH and other cached variables
# so nothing other package finds this opencv
set(CMAKE_PREFIX_PATH ${TMP_PREFIX_PATH})
unset(OpenCV_CONFIG_PATH CACHE)
unset(OpenCV_DIR CACHE)
...
include_directories(
include
${catkin_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)
target_link_libraries(foo_node
${catkin_LIBRARIES}
${OpenCV_LIBS}
)
重新编译cv_bridge和pipeline
https://github.com/ros-perception/vision_opencv
https://github.com/ros-perception/image_pipeline
================find_path Hints=====================
find_path(DARKNET_PATH
NAMES "README.md"
HINTS "${CMAKE_CURRENT_SOURCE_DIR}/../darknet/")
message("Darknet path dir = ${DARKNET_PATH}")
https://cmake.org/cmake/help/v3.6/command/find_path.html#command:find_path
A short-hand signature is:
find_path (<VAR> name1 [path1 path2 ...])
The general signature is:
find_path (
<VAR>
name | NAMES name1 [name2 ...]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
============file 新建文件夹===========
# /home/yake/catkin_ws/src/dvo_slam/dvo_benchmark/CMakeLists.txt
# create output directory
file(MAKE_DIRECTORY "${PROJECT_SOURCE_DIR}/output")
file(MAKE_DIRECTORY "${PROJECT_SOURCE_DIR}/output/video")
===============CMake_Modules文件夹==FindG2O.CMAKE===============
http://www.cnblogs.com/gaoxiang12/p/4739934.html
高翔CMake modules的拷贝
安装成功后,你可以在/usr/local/include/g2o中找到它的头文件,而在/usr/local/lib中找到它的库文件。
# 添加g2o的依赖# 因为g2o不是常用库,要添加它的findg2o.cmake文件
LIST( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules )
SET( G2O_ROOT /usr/local/include/g2o )
FIND_PACKAGE( G2O )
# CSparse
FIND_PACKAGE( CSparse )
INCLUDE_DIRECTORIES( ${G2O_INCLUDE_DIR} ${CSPARSE_INCLUDE_DIR} )
添加Cmake_module_path,然后设置G2O_ROOT的路径。
手动新建cmake_modules文件夹,把g2o代码目录下的cmake_modules里的东西都拷进来,保证cmake能够顺利找到g2o。
另外还有两篇自己的关于CMakeList的写法