cmake(catkin_make) 自建库封装package

3 篇文章 0 订阅

cmake(catkin_make) 自建库封装package

https://blog.csdn.net/convpool/article/details/87726649

以下为自建库封装过程,及用find_package 工具自动找到自建库头文件及库文件的完整过程。

1、新建链接库包

目录树如下

mylib

├── CMakeLists.txt
├── mylib
│ ├── mylib.cpp 
│ └── mylib.h
├── mylib-config.cmake.in (便于find_package使用找到头文件位置和库位置)
└── package.xml

package.xml

ros 编译所需文件

<?xml version="1.0"?>
<package format="2">
  <name>mylib</name>
  <version>0.0.0</version>

  <description>
   1
  </description>

  <maintainer email="111@gmail.com">Jerry JI</maintainer>

  <license>BSD</license>

  <author email="111@gmail.com">Jerry JI</author>
  
  <buildtool_depend>catkin</buildtool_depend>

  <build_depend>g++-static</build_depend>

  <export>
    <build_type>cmake</build_type>
  </export>

</package>

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12)
project(mylib) #工程名

#安装包内必须文件及文件夹
install(FILES package.xml DESTINATION share/mylib/)

#编译配置
add_library(mylib SHARED mylib/mylib.cpp)

set(TARGET_COMPILE_FLAGS "${TARGET_COMPILE_FLAGS} -std=c++11")
set_target_properties(mylib PROPERTIES
  COMPILE_FLAGS ${TARGET_COMPILE_FLAGS})

#安装相关文件
install(
  TARGETS mylib #待安装库、可执行文件名
  EXPORT mylibExport #待输出安装配置文件 note 2
  ARCHIVE DESTINATION lib
  LIBRARY DESTINATION lib
  RUNTIME DESTINATION bin
)


# 安装头文件
file(GLOB_RECURSE hdrs "*.h")

foreach(HDR ${hdrs})
  file(RELATIVE_PATH REL_FIL ${PROJECT_SOURCE_DIR} ${HDR})
  get_filename_component(INSTALL_DIR ${REL_FIL} DIRECTORY)

  install(
    FILES
      ${HDR}
    DESTINATION
      include/${INSTALL_DIR}
  )
endforeach()

# 安装产生的头文件
file(GLOB_RECURSE hdrs "*.h.in")

foreach(HDR ${hdrs})
  file(RELATIVE_PATH REL_FIL ${PROJECT_SOURCE_DIR} ${HDR})
  get_filename_component(DIR ${REL_FIL} DIRECTORY)
  get_filename_component(FIL_WE ${REL_FIL} NAME_WE)
  install(
    FILES
      ${PROJECT_BINARY_DIR}/${DIR}/${FILE_WE}
    DESTINATION
      include/${DIR}
  )
endforeach()

#安装find_package所需的配置文件

set(MYLIB_CMAKE_DIR share/mylib/cmake) #note 1
include(CMakePackageConfigHelpers)
configure_package_config_file(
  mylib-config.cmake.in #用于转变成.cmake文件的输入文件
  ${PROJECT_BINARY_DIR}/cmake/mylib/mylib-config.cmake #find_package 找到的文件
  PATH_VARS MYLIB_CMAKE_DIR #此处与 note 1 变量名一致
  INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/share/mylib
)

install(
  EXPORT mylibExport #待输出安装配置文件 note 2
  DESTINATION share/mylib/cmake/
  FILE MYLIBTargets.cmake #待输出安装配置文件名 note 3
)

install(
  FILES ${PROJECT_BINARY_DIR}/cmake/mylib/mylib-config.cmake#find_package 找到的文件
  DESTINATION share/mylib/
)

mylib-config.cmake.in

@PACKAGE_INIT@
#MYLIB_CMAKE_DIR 以及 PACKAGE_MYLIB_CMAKE_DIR中的MYLIB_CMAKE_DIR部分均与note 1的变量名一致
set_and_check(MYLIB_CMAKE_DIR "@PACKAGE_MYLIB_CMAKE_DIR@")

include("${MYLIB_CMAKE_DIR}/MYLIBTargets.cmake")#待输出安装配置文件名 note 3

list(APPEND mylib_INCLUDE_DIRS ${PACKAGE_PREFIX_DIR}/include/mylib/ )#配置头文件目录

list(APPEND mylib_LIBRARIES ${PACKAGE_PREFIX_DIR}/lib/libmylib.so)#配置库文件目录

mylib下的源文件

mylib.h

#ifndef MYLIB_H
#define MYLIB_H
#include <iostream>

void hello();
#endif//MYLIB_H

mylib.cpp

#include "mylib.h"
void hello()
{
	std::cout<<"hello world!"<<std::endl;
}

上述文件编写完成后可以用以下命令来编译安装

catkin_make_isolated --install && source devel_isolated/setup.sh #ros 的安装方式,自动安装到install_isolated所在目录下mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=./install && make install #cmake 的安装方式,可以安装到指定目录下

2、测试程序

以下为测试程序包目录树

test

├── CMakeLists.txt
├── launch
│ └── test.launch
├── package.xml
└── src
└── testnode.cpp

package.xml

<?xml version="1.0"?>
<package  format="2">
  <name>test</name>
  <version>0.0.0</version>

  <description>
	This is a ROS implementation of test by bit RCIV
  </description>

  <maintainer email="111@gmail.com">Jerry JI</maintainer>

  <license>BSD</license>

  <author email="111@gmail.com">Jerry JI</author>
  
   <buildtool_depend>catkin</buildtool_depend>

  <build_depend>g++-static</build_depend>

  <depend>mylib</depend>
  <depend>roscpp</depend>
  <depend>roslaunch</depend>
  <depend>roslib</depend>

  <export>
  </export>
</package>

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(test)

set(PACKAGE_DEPENDENCIES
  roscpp
  roslib
)

find_package(catkin REQUIRED COMPONENTS ${PACKAGE_DEPENDENCIES})

find_package(mylib REQUIRED) #找到自建库安装包

#安装所需文件夹
install(DIRECTORY launch DESTINATION share/test/)

catkin_package(
  CATKIN_DEPENDS ${PACKAGE_DEPENDENCIES}
  DEPENDS 
  INCLUDE_DIRS
)
#mylib_INCLUDE_DIRS 为mylib mylib-config.cmake.in文件内设置好的头文件目录
include_directories(SYSTEM  ${catkin_INCLUDE_DIRS} ${mylib_INCLUDE_DIRS})


add_executable(testnode src/testnode.cpp )# 编译可执行文件
#mylib_LIBRARIES 为mylib mylib-config.cmake.in文件内设置好的库文件
target_link_libraries(testnode PUBLIC ${catkin_LIBRARIES}  ${mylib_LIBRARIES}  )

set(TARGET_COMPILE_FLAGS "${TARGET_COMPILE_FLAGS} -std=c++11")
set_target_properties(testnode PROPERTIES
  COMPILE_FLAGS ${TARGET_COMPILE_FLAGS})

#安装可执行文件等
install(TARGETS testnode
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

install(
  TARGETS testnode
  EXPORT testnodeExport
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
)

src/testnode.cpp

#include <ros/ros.h>

#include <mylib.h>

int main(int argc, char** argv)
{
  ros::init(argc, argv, "testnode");
  ros::NodeHandle nh;

  hello();
  ros::spin();

  return 0;
}

launch/test.launch

<?xml version="1.0" encoding="UTF-8"?>
<launch>
    
  <node pkg="test" type="testnode" name="testnode" args="" output="screen">
  </node>
    
</launch>

上述文件编写完成后可以用以下命令来编译,运行

catkin_make_isolated --install && source devel_isolated/setup.sh #ros 的安装方式,自动安装到install_isolated所在目录下
roslaunch test test.launch
### 回答1: cmakecatkin_make都是用于构建ROS软件包的工具,但它们有一些区别: 1. cmake是一个通用的构建工具,可以用于构建任何类型的软件,而catkin_make是ROS特有的构建工具,专门用于构建ROS软件包。 2. cmake需要手动编写CMakeLists.txt文件来描述软件包的构建过程,而catkin_make则使用ROS特有的CMake宏来简化构建过程。 3. cmake可以生成各种不同类型的构建系统,如Makefile、Ninja、Visual Studio等,而catkin_make只能生成Makefile。 4. cmake可以在任何操作系统上使用,而catkin_make只能在ROS支持的操作系统上使用。 总之,cmake是一个通用的构建工具,而catkin_make是ROS特有的构建工具,用于构建ROS软件包。 ### 回答2: CMakeCatkin_make都是常用的构建工具,但两者有一些不同之处。 CMake是一个跨平台的工具,其目的是帮助用户管理复杂的构建过程,自动生成构建文件以编译源代码。它采用完全模块化的设计,允许使用不同的外部库和工具。 Catkin_make是一个针对ROS(机器人操作系统)开发的Build系统,是CMake的扩展,也是ROS的默认Build系统。Catkin_make提供了一种有组织的方式来管理ROS工程,可以编译C++和Python编写的ROS程序。 CMakeCatkin_make有一些重要差异: 1.依赖库的支持 CMake可以很好地管理依赖关系,但Catkin_make提供了特殊的例程,以更好地支持ROS包管理系统中的依赖库。 2.编译输出 当使用CMake时,可以通过输出目录进行编译,而不会覆盖源文件。但是,Catkin_make通常会在源目录中创建可执行文件,这可能会导致在使用多个源目录时出现混淆。 3.ROS命令的支持 Catkin_make拓展了CMake以支持ROS命令,如ROS包构建、运行ROS节点和上传ROS包。 总之,CMakeCatkin_make各有其优点,在不同的情况下选择不同的工具进行编译。CMake可以为ROS项目提供更大的灵活性和可重用性,而Catkin_make有更高效的ROS包构建工具,支持ROS特定的功能和命令。 ### 回答3: CMakeCatkin Make都是用于自动化构建的工具。CMake是一个跨平台的构建工具,它可以生成Unix Makefiles、Ninja等不同构建系统的构建文件,可以适应各种不同的编程语言和平台,可移植性强。而Catkin Make是一个ROS(机器人操作系统)专用的工具,是在CMake的基础上扩展而来的,用于自动化构建catkin packages。 Catkin Make的一个重要特点是ROS系统下的模块化和可重用性,它是ROS的构建系统,用于构建catkin packages,而CMakeCatkin Make的基础,Catkin Make在需要时会调用CMake,如果我们只是在构建ROS时,则直接用catkin_make就可以了,如果我们需要构建其他不是ROS模块的软件,就需要用CMake进行构建。 CMake可以用于实现跨语言的构建,比如C++、Python、Java等,这样一来,CMake能够为构建提供更广泛的支持。而Catkin Make则专注于ROS的构建环境,它将ROS的依赖性和ROS模块的构建过程更加简化并且自动化,适用于机器人操作系统的设备驱动程序和其他模块的开发。 CMake中依赖关系的处理涉及更多的脚本操作和手动干预,与此相比,Catkin Make的依赖管理机制更为强大、有效和自动化。Catkin Make将系统目标更显式地与ROS模块的目标建立联系,有利于ROS模块更加稳定的构建。 综上所述,CMakeCatkin Make的主要区别在于: 1.CMake是一个跨平台的构建工具,而Catkin Make是ROS的构建系统,是在CMake的基础上扩展而来的。 2.CMake能够为构建提供更广泛的支持,包括机器人操作系统之外的其他领域和语言,而Catkin Make则更专注于ROS的构建环境。 3.CMake的依赖关系处理需要更多的手动干预,而Catkin Make有更强大和自动化的依赖管理机制,有利于模块更稳定地构建。 因此,在ROS机器人操作系统领域,应该使用Catkin Make来构建ROS package,而在其他涉及的领域应该使用CMake来进行构建。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值