Intermediate
Author: kuzen, Natsu-Akatsuki
build system
和build 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_make
,catkin_make_isolated
, catkin_tools
, ament_tools
,colon
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)
检查一:检查一波 package.xml
是否写好了build tag
检查二:若使用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)
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
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的目标文件重名
找不到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中编译通过但是遇到可执行文件找不到的问题:指令顺序的重要性
catkin_package
要放在add_executable
前,案例(松灵底盘)
opencv库兼容性问题
不同版本的opencv库或有功能相同但名字不同的问题,在编译时可能会出现未声明等报错,这时候就需要查文档就行修改。
实例: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库的升级换代
有关模块
有关函数
// 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 .
备注
catkin_lint相关提示信息仅供参考,不一定准确
ccmake
cmake TUI程序,在终端交互式地配置选项
CLI
install
sudo apt install cmake-curses-gui
ccmake ..
cmake-gui
cmake GUI程序,在图形化界面交互式地配置选项