Intermediate

Author: kuzen, Natsu-Akatsuki

  • build systembuild tools是不同的概念

  • build tool的作用单元是一系列的package,能够构建包的依赖关系图从而根据依赖关系,为每个包调用特定的build system

Build System

Make

Uninstall

默认不提供make uninstall,需要自己定义。相关内容等价于:

但并不能删除相关的文件夹
xargs rm < install_manifest.txt

Ninja

Install

sudo apt install ninja-build

Build

cmake -GNinja ..

CMake

Install

  • apt 下载

linux 18.04对应3.10版本
sudo apt-get install cmake
e.g.
wget https://github.com/Kitware/CMake/releases/download/v3.18.3/cmake-3.18.3.tar.gz
要安装cmake-qt-gui时需要添加如下option
./bootstrap --qt-gui

CLI

Wno-dev非gcc的编译参数,常应用于屏蔽PCL的警告
cmake -Wno-dev
显示生成Makefile的时间
cmake -E time cmake ..

使用conda下的cmake文件

在conda环境安装了相关包之后,需要conda activate才能使用其cmake文件,如果不activate的话,需要类似如下类型的参数配置

以pybind11为例
-Dpybind11_DIR=${env_path}/share/cmake/pybind11

判断一个路径对应的是否是一个文件夹

if(IS_DIRECTORY "...")

调用系统可执行文件

  • find_program:类似which,找到某个可执行文件的路径

  • execute_process:执行某个可执行文件

判断某个可执行文件是否存在
find_program(GDOWN_AVAIL "gdown")
if (NOT GDOWN_AVAIL)
  message("...")
endif()
执行某个可执行文件
execute_process(COMMAND mkdir [args...])
execute_process(COMMAND gdown [args...])

引入外部项目

该command为3.11的特性,会在configure time时导入(pollute)文件

cmake_minimum_required(VERSION 3.14)

# 导入FetchContent module
include(FetchContent)
# 配置等下Fetch时的配置参数
FetchContent_Declare(
  mycom_toolchains
  URL  https://intranet.mycompany.com//toolchains_1.3.2.tar.gz
)
# 触发下载(Fetch)
FetchContent_MakeAvailable(mycom_toolchains)

提示

对于cmake,configure time是指生成cache文件的时间段;有三种time,分别是配置期(configure time),编译期(build time)和安装期(install time);配置期的命令包括add_subdirectory, include, file

待处理

暂未清楚不同期导入文件所带来的结果

获取上层目录

get_filename_component(PARENT_DIR ${PROJECT_SOURCE_DIR} DIRECTORY)

备注

在include_directory填路径时使用".."也能生效

查看编译和链接时间

# >>> evaluate compile and link time
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time")
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CMAKE_COMMAND} -E time")
# <<< evaluate compile and link time

备注

catkin build的可查看日志build.make.log

保留中间产物

target_compile_options(<target_name> PUBLIC "-save-temps")

ROS Build Tool

ROS编译工具根据迭代顺序依次有: catkin_makecatkin_make_isolatedcatkin_toolsament_toolscolon

catkin_make

CLI

单独编译某些package
catkin_make -DCATKIN_WHITELIST_PACKAGES="package1;package2"
等价于:
catkin_make --only-pkg-with-deps
撤销白名单设置
catkin_make -DCATKIN_WHITELIST_PACKAGES=""
使用ninja进行编译(编译速度会更快,但报错信息无高亮,日志可读性差)
catkin_make --use-ninja

备注

要屏蔽某些包被编译,可以创建一个名为 `CATKIN_IGNORE`的文件到这些包所在的目录下

catkin-tools

Install

添加ROS仓库
...
sudo apt-get update
sudo apt-get install python3-catkin-tools

CLI

  • build(编译)

跳过对某些已编译包的编译(实际上只是检查)
catkin build --start-with <pkg>
编译当前所处的包
catkin build --this
  • config(配置参数)

配置编译参数
catkin config -DPYTHON_EXECUTABLE=/opt/conda/bin/python3 \
-DPYTHON_INCLUDE_DIR=/opt/conda/include/python3.8 \
-DPYTHON_LIBRARY=/opt/conda/lib/libpython3.8.so
追加配置参数
catkin config -a <配置参数>
移除配置参数
catkin config -r <配置参数>
使用catkin_make参数
catkin config --catkin-make-args [args]
配置白名单(或黑名单)
catkin config --whitelist/blacklist <pkg>
取消白名单配置
catkin config --no-whitelist
catkin config/build --env-cache
catkin config/build --no_env_cache
  • clean(清理中间文件)

指定删除某个package
catkin clean <package_name>
删除所有 product
catkin clean --deinit
移除非src文件夹下的包的编译产物
catkin clean --orphans

备注

catkin clean 默认删除 devel , log 等目录,但隐藏目录 .catkin_tools , .catkin_workspace 不会清除

catkin config --profile debug -x _debug --cmake-args -DCMAKE_BUILD_TYPE=Debug
catkin config --profile release -x _release --cmake-args -DCMAKE_BUILD_TYPE=Release
catkin build --profile debug
catkin build --profile release
alias catkin_debug="catkin build --profile debug"
alias catkin_release="catkin build --profile release"
-x: 文件夹后缀

Deploy a catkin package

colcon

Install

安装
sudo apt install python3-colcon-common-extensions
配置跳转
echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ~/.bashrc \
&& echo "export _colcon_cd_root=/opt/ros/humble/" >> ~/.bashrc
配置命令行Tab补全
echo "source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash" >> ~/.bashrc
配置clean拓展插件
git clone https://github.com/ruffsl/colcon-clean
python3 setup.py install --user
colcon clean
colcon clean packages --base-select build install

CLI

暂未发现其支持像 catkin build 中的 context-aware 功能

编译工作空间的所有pkg
colcon build
只编译部分包
colcon build -packages-select <pkg_name>
使用符号链接而不是复制文件进行安装
colon build --symlink-install
option:
--cmake-args -DCMAKE_BUILD_TYPE=Debug
--event-handlers console_direct+   编译时显示所有编译信息
--event-handlers console_cohesion+  编译完一个包后才显示它的编译信息
--packages-select <name-of-pkg>  编译某个特定的包(不包含其依赖)
--packages-up-to <name-of-pkg>   编译某个特定的包(包含其依赖)
--packages-above <name-of-pkg>  重新编译某个包(和依赖这个包的相关包)
source devel/setup.bash的等价命令
source install/local_setup
使用软链接进行安装
使用Ninja;
设置并行个数
日志及时输出到终端
colcon build --symlink-install \
--cmake-args -G Ninja \
--parallel-workers 8 \
--event-handlers console_direct+
  • list

显示当前工作空间的所有包的信息
colcon list
List all packages in the workspace in topological order and visualize their dependencies
colcon graph

Q&A

could not find a package configuration file(catkin build)

image-20210912141918386

检查一:检查一波 package.xml 是否写好了build tag

img

检查二:若使用catkin build的话检查一波是否将find_package(catkin REQUIRED...)放置于第三方库find_package的前面(具体原因未知,此为经验性结论)

/usr/bin/ld: cannot find

  • 在使用TensorRT部署时(make)出现如下的一些报错

/usr/bin/ld: cannot find -lnvonnxparser
/usr/bin/ld: cannot find -lnvinfer_plugin
/usr/bin/ld: cannot find -lcudnn

一种解决方案为使用环境变量 LIBRARY_PATH 。此前认为时需要修改环境变量 LD_LIBRARY_PATH ,添加动态库链接搜索路径,但实际上该环境变量只影响运行期(runtime)链接器 ld.so 的搜索路径。而不影响编译期(complie time)链接器 /usr/bin/ld 的搜索路径。要影响编译期链接的话,需要修改环境变量 LIBRARY_PATH

env LIBRARY_PATH=/usr/local/cuda/lib64:${HOME}/application/TensorRT-8.0.0.3/lib make

另一种解决方案为在CMakeLists上增设:

# e.g.
link_directories(/usr/local/cuda/lib64/ $ENV{HOME}/application/TensorRT-8.0.0.3/lib)
img img

No CMAKE_CXX_COMPILER could be find

sudo apt install build-essential

未定义的引用(undefined reference)

该种错误发生在链接时期。一般来说有以下几种情况。一种是没下载相关的链接库(可locate检测一下);一种是库的冲突,比如ros的opencv库与从源码编译安装到系统的opencv库发生冲突,至依赖被覆盖而使目标文件无法成功链接到库。可卸载安装到系统的opencv库(如用sudo make uninstall来卸载);一种是已下载但没找到,添加相关搜素路径即可

imported target "..." references the file "..." but this file does not exist

locate 定位相关位置后,使用软链接

no such file or directory:没有找到头文件的路径,导入头文件失败

在已有头文件的情况下,可直接添加绝对路径进行搜索;或者头文件名不对,进行修改即可

# e.g. include/utility.h:13:10: fatal error: opencv2/cv.h: No such file or directory #include <opencv2/cv.h>
include_directories(
   include
   绝对路径   # e.g. /home/helios/include
)

目标文件命名冲突(for catkin)

rslidar和velodyne package的目标文件重名

img

找不到cuda库和tensorrt库相关文件

在autoware中,使用有关深度学习的cmake时,不能直接通过find_package找到cuda库和tensorRT;autoware配置环境时是使用deb包来安装的,会随带着将cmake等文件也安装到系统路径中;而如果使用的是local的安装方式,则find_package失效时,可参考如下方法进行添加:

include_directories($ENV{HOME}/application/TensorRT-7.2.3.4/include/)
link_directories($ENV{HOME}/application/TensorRT-7.2.3.4/lib)
`

Failed to compute shorthash for libnvrtc.so

在CMakeList.txt开头添加find_package(PythonInterp REQUIRED)

Catkin build 使用Ninja

参考该issue,尝试使用ninja进行编译,但实测编译时间跟make差不多

ROS中编译通过但是遇到可执行文件找不到的问题:指令顺序的重要性

img

img

opencv库兼容性问题

  • 不同版本的opencv库或有功能相同但名字不同的问题,在编译时可能会出现未声明等报错,这时候就需要查文档就行修改。

img

实例:kalibr 16.04/14.04 -> kalibr 20.04

  • CheckLists

16.04(apt version)

20.04(apt version 4.2)

CV_LOAD_IMAGE_COLOR (icv::imread)

cv:: IMREAD_COLOR

  • 一般来说可以尝试先将CV_转化为cv::来进行替换

boost库的升级换代

  • 有关模块

image-20210918004819514 image-20210918005720515
  • 有关函数

// for 16.04
boost::this_thread::sleep(boost::chrono::microseconds(SmallIterval));
// for 20.04
std::this_thread::sleep_for(std::chrono::microseconds(SmallIterval));

备注

在编译时有些函数不存在,可能是因为更新换代而被取代了,这时候查一下google和相关文档即可

ambigious candidate

Reference to 'shared_ptr' is ambiguous candidate found by name lookup is 'boost::shared_ptr' candidate found by name lookup is 'pcl::shared_ptr'

pcl库和boost都有自己的share_ptr实现,而源程序使用了using这种方法,使得编译器不知道该调用哪个share_ptr

using namespace boost;
using namespace pcl;

void removeText(shared_ptr<visualization::PCLVisualizer> viewer); // ERROR
void removeText(pcl::shared_ptr<visualization::PCLVisualizer> viewer); // TRUE

Tools

catkin-lint

静态查看catkin工程错误

安装
sudo apt install catkin-lint
example
catkin_lint -W0 .
image-20210912200754563

备注

catkin_lint相关提示信息仅供参考,不一定准确

ccmake

cmake TUI程序,在终端交互式地配置选项

image-20210925215521631

CLI

install
sudo apt install cmake-curses-gui
ccmake ..

cmake-gui

cmake GUI程序,在图形化界面交互式地配置选项

Reference