CMake学习

16 篇文章 0 订阅
9 篇文章 0 订阅

背景:

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==============

http://wiki.ros.org/opencv3

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的写法

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yaked19

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值