ego-planner-master/src/planner/bspline_opt/CMakeLists.txt

 声明:代码全部来源于https://github.com/ZJU-FAST-Lab/ego-planner-swarm,本人仅作解读学习交流使用,未有任何盈利,如有侵权,烦请联系笔者。

cmake_minimum_required(VERSION 2.8.3)
project(bspline_opt)

set(CMAKE_BUILD_TYPE "Release")
ADD_COMPILE_OPTIONS(-std=c++11 )
ADD_COMPILE_OPTIONS(-std=c++14 )
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")

find_package(Eigen3 REQUIRED)
find_package(PCL 1.7 REQUIRED)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  visualization_msgs
  plan_env
  cv_bridge
  path_searching
)

catkin_package(
 INCLUDE_DIRS include
 LIBRARIES bspline_opt
 CATKIN_DEPENDS plan_env
#  DEPENDS system_lib
)

include_directories( 
    SYSTEM 
    include 
    ${catkin_INCLUDE_DIRS}
    ${Eigen3_INCLUDE_DIRS} 
    ${PCL_INCLUDE_DIRS}
)

add_library( bspline_opt 
    src/uniform_bspline.cpp 
    src/bspline_optimizer.cpp 
    src/gradient_descent_optimizer.cpp
    )
target_link_libraries( bspline_opt
    ${catkin_LIBRARIES} 
    )  

cmake_minimum_required(VERSION 2.8.3)
project(bspline_opt)

这是一个 CMake 构建系统的项目声明,指定了项目名称为 bspline_opt。CMake 是一款跨平台的构建工具,用于管理 C++ 项目的编译、链接等操作。在这个项目中,CMake 的版本需求为 2.8.3 及以上。


set(CMAKE_BUILD_TYPE "Release")
ADD_COMPILE_OPTIONS(-std=c++11 )
ADD_COMPILE_OPTIONS(-std=c++14 )
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")

这段代码是用来设置 C++ 代码的编译选项和构建类型的。具体解释如下:

  • set(CMAKE_BUILD_TYPE "Release"):设置构建类型为 Release,即编译器会优化代码以提高程序的运行效率。其他常见的构建类型还包括 Debug 和 RelWithDebInfo 等。
  • ADD_COMPILE_OPTIONS(-std=c++11 ):指定编译器使用 C++11 标准进行编译。C++11 是一种较新的 C++ 标准,引入了许多新的语言特性,使得程序编写更加方便和高效。
  • ADD_COMPILE_OPTIONS(-std=c++14 ):这一行与上一行类似,只是将编译器指定的 C++ 标准提高到了 C++14。C++14 是 C++11 的扩展版本,也引入了一些新的特性。
  • set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g"):设置编译器编译 C++ 代码时的编译选项。-O3 表示使用最高级别的优化选项,即编译器会尽可能地优化代码;-Wall 表示启用所有警告信息;-g 表示生成调试信息,方便程序调试。

如果一个项目中使用了C++11和C++14的特性,需要同时使用 -std=c++11-std=c++14 选项来保证代码的兼容性。如果只使用 -std=c++14 选项,可能会导致C++11中的某些特性不可用,从而导致编译错误。


find_package(Eigen3 REQUIRED)
find_package(PCL 1.7 REQUIRED)

这两行代码是在CMake中调用第三方库Eigen3和PCL,其中Eigen3是一个用于线性代数的C++模板库,而PCL是一个用于3D点云处理的C++库。

find_package是CMake中的一个函数,用于查找和加载需要的软件包、库或依赖项。上面的代码中使用了find_package函数来查找已经安装在系统中的Eigen3和PCL库,并将它们导入到CMake项目中,以便在项目中使用这些库的函数和类。需要注意的是,PCL库的版本号是1.7,因此需要使用find_package(PCL 1.7 REQUIRED)来指定版本。


find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  visualization_msgs
  plan_env
  cv_bridge
  path_searching
)

这段代码使用了 find_package 函数来查找指定的 catkin 组件,具体查找的组件名称如下:

  • roscpp
  • rospy
  • std_msgs
  • visualization_msgs
  • plan_env
  • cv_bridge
  • path_searching

这些组件名称对应的是 ROS 中的一些核心组件和一些自定义的 ROS 包。通过 find_package 函数,可以在系统中查找这些组件并获取相关的头文件、库文件等信息。找到这些组件后,可以将它们添加到后续的工程中,方便进行程序的编写和构建。

这些包的功能如下:

  • roscpp:是ROS中C++客户端库,提供了用于ROS节点的API。
  • rospy:是ROS中Python客户端库,提供了用于ROS节点的API。
  • std_msgs:是ROS的标准消息包,包含了常见的消息类型,如整数、浮点数、字符串、布尔值等。
  • visualization_msgs:是ROS用于可视化的消息包,其中包含了与可视化相关的消息类型,如Marker、Image、PointCloud2等。
  • plan_env:是自动驾驶中用于路径规划的一个ROS包,提供了用于规划环境的接口和实现。
  • cv_bridge:是ROS中用于将ROS消息和OpenCV图像相互转换的库。
  • path_searching:是ROS中用于路径搜索的库,提供了A*、Dijkstra等算法的实现。

在 CMakeLists.txt 文件中,使用 find_package 命令可以找到和加载需要的依赖库,而 REQUIRED COMPONENTS 则用来指定所需要的组件。这样,在进行编译时,如果所需的组件没有安装,编译会失败,程序也无法正常运行。

例如,假设在 CMakeLists.txt 中使用了 find_package(catkin REQUIRED COMPONENTS roscpp std_msgs) 命令,则在编译时会检查是否已经安装了 roscpp 和 std_msgs 组件。如果没有安装,编译将失败。通过这种方式,可以方便地确保所有需要的组件都已经安装了,避免运行时因为缺少依赖库而出现问题。

REQUIRED表示这些组件是必需的,如果找不到,则会导致配置错误。如果省略COMPONENTS,则find_package将查找指定包的所有模块(包括其依赖项),而不是只查找特定组件。通常情况下,省略COMPONENTS是没有问题的,因为如果要使用包的组件,你通常需要包的全部功能和依赖项。但是,指定组件可以缩小查找的范围,节省时间。


catkin_package(
 INCLUDE_DIRS include
 LIBRARIES bspline_opt
 CATKIN_DEPENDS plan_env
#  DEPENDS system_lib
)

Catkin是ROS的一个构建系统,用于构建ROS软件包。一个Catkin软件包是ROS软件包中常用的一种类型,它是一个具有一些特定目录结构的目录。Catkin使用CMake构建系统来编译ROS软件包。

在Catkin软件包的CMakeLists.txt文件中,可以使用catkin_package()函数来指定Catkin软件包的信息。这个函数会生成一些必要的信息,比如安装目录,导出的目录,运行时目录等,使得其他ROS软件包可以正确地依赖当前的软件包。这些信息可以被其他Catkin软件包使用,以便于正确地链接和使用当前软件包的功能。

在catkin_package()函数中,可以指定当前Catkin软件包的一些元数据,如包含的头文件目录(INCLUDE_DIRS)、需要链接的库(LIBRARIES)、运行时依赖的其他Catkin软件包(CATKIN_DEPENDS)等等。这些信息将被Catkin系统用来自动生成一些CMake和ROS配置文件,以便于其他软件包正确地使用和链接当前软件包。

catkin_package()函数用于配置当前包的信息,包括其包含的目录、链接库、依赖关系等等。其中:

  • INCLUDE_DIRS:用于指定当前包所包含的头文件的路径。
  • LIBRARIES:用于指定当前包要链接的库。
  • CATKIN_DEPENDS:用于指定当前包依赖的其他Catkin包。
  • DEPENDS:用于指定当前包依赖的非Catkin库。

在这段代码中,catkin_package()函数指定了当前包的包含目录和链接库,以及其依赖关系,其中:

  • INCLUDE_DIRS指定了包含目录为include
  • LIBRARIES指定了链接库为bspline_opt
  • CATKIN_DEPENDS指定了当前包依赖的Catkin包为plan_env

plan_env是一个catkin组件,被列在了find_package(catkin REQUIRED COMPONENTS ...)CATKIN_DEPENDS ...中。find_package用于查找和配置catkin组件和系统库,CATKIN_DEPENDS声明了当前包依赖的catkin组件。在这个例子中,当前包依赖于plan_env组件,因此它在find_package(catkin REQUIRED COMPONENTS ...)中列出,而在CATKIN_DEPENDS ...中使用。


include_directories( 
    SYSTEM 
    include 
    ${catkin_INCLUDE_DIRS}
    ${Eigen3_INCLUDE_DIRS} 
    ${PCL_INCLUDE_DIRS}
)

这段代码指定了包含文件的目录。具体来说,它使用include_directories()函数将以下目录添加到编译器的包含路径中:

  • include: 包含头文件的目录。
  • ${catkin_INCLUDE_DIRS}: 其他 catkin 软件包提供的头文件的目录。
  • ${Eigen3_INCLUDE_DIRS}: Eigen3 库提供的头文件的目录。
  • ${PCL_INCLUDE_DIRS}: PCL 库提供的头文件的目录。

通过将这些目录添加到编译器的包含路径中,代码中就可以直接使用这些头文件中定义的类和函数。

SYSTEMinclude_directories命令的一个选项,用于告诉CMake在包含头文件时不应该产生警告信息。这个选项通常用于包含系统库的头文件,这些库的头文件可能会产生一些警告信息,但通常情况下我们不需要理会这些警告。

include指定的路径是头文件(.h文件)所在的目录,可以是相对路径或绝对路径。如果在当前目录下有include文件夹,那么使用include_directories(include)也可以指定该路径。


add_library( bspline_opt 
    src/uniform_bspline.cpp 
    src/bspline_optimizer.cpp 
    src/gradient_descent_optimizer.cpp
    )

这段代码使用 add_library 命令定义了一个名为 bspline_opt 的库,并列出了需要编译的源代码文件。具体来说,这个库由三个源文件组成,分别是 uniform_bspline.cppbspline_optimizer.cppgradient_descent_optimizer.cpp,这些文件都在 src 目录下。


target_link_libraries( bspline_opt
    ${catkin_LIBRARIES} 
    )  

target_link_libraries函数用于将库与目标文件链接。在这里,bspline_opt库将链接到${catkin_LIBRARIES}中包含的所有库。${catkin_LIBRARIES}是一个catkin包中定义的变量,其中包含了所有在catkin_package()函数中声明的库。

${catkin_LIBRARIES} 是一个 CMake 变量,它包含 catkin 工作空间中所有库的名称。这个变量在使用 find_package(catkin ...) 命令时自动生成,并且被用于在目标链接时指定库的名称。在这个例子中,${catkin_LIBRARIES} 被用于链接 bspline_opt 库。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值