scons编译ros程序包实践

文章介绍了如何在ROS开发中使用SCons进行编译,以提高效率和灵活性。作者提供了三个实例,从基本的ROS程序编译,到处理自定义msg和srv消息,再到依赖自建的ROS库。每个实例都详细说明了SConstruct文件的配置,包括设置ROS库路径、项目库路径、编译和链接选项。通过这种方式,可以避免全项目编译,提高开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.需求.

代码开发阶段,不想使用catkin_make 全编译,或单独编译.
想使用scons,单独的编译ros程序, 按照scons交叉编译的配置,进行ros编译成功.

2.步骤.

实例1 只依赖ros库

1.目录结构:

fssImu614e/
├── CMakeLists.txt
├── include
│   └── fssImu614e
├── package.xml
└── src
    ├── fssImu614e.h
    ├── main_imu.cpp
    ├── SConstruct

2.SConstruce

import os
ros_distro=os.getenv("ROS_DISTRO")
print('env ros',ros_distro)

env = Environment()
ros_include = ' -I /opt/ros/%s/include/'%(ros_distro)
ros_libdir = ['/opt/ros/%s/lib'%(ros_distro)]
ros_lib_dep = ['roscpp','rosconsole']

# 编译选项
env['CCFLAGS'] = ros_include
# 调试选项开关
# env['CCFLAGS'] += ' -g -O0 -DDEBUG'

# 链接选项
env['LIBPATH'] = ros_libdir
env['LIBS'] = ros_lib_dep
env['RPATH'] = ros_libdir
env['LINKFLAGS'] = '-Wl,--copy-dt-needed-entries'

env.Program('serial_imu', 'main_imu.cpp')

3.测试

cd fssImu614e/src
scons

scons: Reading SConscript files …
env ros noetic
scons: done reading SConscript files.
scons: Building targets …
g++ -o main_imu.o -c -ggdb -O0 -I /opt/ros/noetic/include/ main_imu.cpp
g++ -o serial_imu -Wl,–copy-dt-needed-entries -Wl,-rpath=/opt/ros/noetic/lib main_imu.o -L/opt/ros/noetic/lib -lserial -lroscpp -lrosconsole
scons: done building targets.

OK, scons 编译ROS程序成功.


2023.06.26更新

实例2 依赖自定义 msg,srv消息

想加载自定义msg,srv时,提示编译失败.
解决方法,将自己ros项目路径添加到 编译选项, 链接选项中.

import os
# ros发行版本
ros_distro=os.getenv("ROS_DISTRO")
print('env ros',ros_distro)

env = Environment()
# ROS库
ros_include = ' -I /opt/ros/%s/include/'%(ros_distro)
ros_libdir = ['/opt/ros/%s/lib'%(ros_distro)]
ros_lib_dep = ['roscpp','rosconsole']

# 项目库
userName=os.getenv("USER")
project_dev='/home/%s/3_work/3_navigation/devel/'%(userName)
project_include = ' -I '+project_dev+'include'
project_libdir = [project_dev+'lib']

#编译选项
env['CCFLAGS'] = ros_include + project_include
# 调试选项开关
# env['CCFLAGS'] += ' -g -O0 -DDEBUG'

# 链接选项
env['LIBPATH'] = ros_libdir + project_libdir
env['RPATH'] = ros_libdir + project_libdir
env['LIBS'] = ros_lib_dep
env['LINKFLAGS'] = '-Wl,--copy-dt-needed-entries'

env.Program('chassis.out', 'main.cpp')

编译 scons

scons: Reading SConscript files …
env ros noetic
scons: done reading SConscript files.
scons: Building targets …
编译
g++ -o main.o -c -g -O0 -Wall -I /opt/ros/noetic/include/ -I /home/liuj/3_work/4_navigation/devel/include main.cpp
链接
g++ -o chassis.out -Wl,–copy-dt-needed-entries -Wl,-rpath=/opt/ros/noetic/lib -Wl,-rpath=/home/liuj/3_work/4_navigation/devel/lib -Wl,-rpath=/opt/ros/noetic/lib -Wl,-rpath=/home/liuj/3_work/4_navigation/devel/lib main.o -L/opt/ros/noetic/lib -L/home/liuj/3_work/4_navigation/devel/lib -L/opt/ros/noetic/lib -L/home/liuj/3_work/4_navigation/devel/lib -lserial -lroscpp -lrosconsole
scons: done building targets.


2023.06.29更新

实例3 依赖自己编写的ros库

use_lib 依赖 lib_test
github代码参考

import os

# 1.编译器
env = Environment()
# clang编译器
# env = Environment(tools = ['default', 'clang'])
# env['CC']=['clang']
# env['CXX']=['clang++']

# 2.ros版本 include + lib
ros_distro=os.getenv("ROS_DISTRO")
print('env ros',ros_distro)
ros_include = ' -I /opt/ros/%s/include/'%(ros_distro)
ros_libdir = ['/opt/ros/%s/lib'%(ros_distro)]
ros_lib_dep = ['roscpp','rosconsole']

def auto_get_ros_dir():
    filePath=os.getcwd()
    idx = filePath.find('src')
    project_dir = filePath[0:idx]
    print("项目位置:%s"%(project_dir))
    return project_dir

# 3.ros项目路径 msg,srv include + lib
project_dir = auto_get_ros_dir()
project_dev = project_dir+'devel/'                              # 自动获取ros devel路径
# userName=os.getenv("USER")
# project_dev='/home/%s/3_work/3_navigation/devel/'%(userName)  # 填写完整ros devel路径
project_include = ' -I '+project_dev+'include'
project_libdir = [project_dev+'lib']

# 4.自己库 include + 链接库名
self_lib_include = ' -I'+project_dir+'src/1_ros_基础/21_ros动态库/lib_test/include/'
ros_lib_dep += ['liblib_test']

# -------------------------------
# -------------------------------
# <1编译选项
env['CCFLAGS'] = ros_include + project_include + self_lib_include
env['CCFLAGS'] += ' -ggdb3 -O0 -DDEBUG'         # 调试选项开关

# <2链接选项
env['LIBPATH'] = ros_libdir + project_libdir
env['RPATH'] = ros_libdir + project_libdir
env['LIBS'] = ros_lib_dep
env['LINKFLAGS'] = '-Wl,--copy-dt-needed-entries'

# <3编译
src=['main.cpp']
env.Program('main.out', src)

编译scons

scons: Reading SConscript files …
env ros noetic
项目位置:/home/liuj/1_Data/5_ros_example/ros1/
scons: done reading SConscript files.
scons: Building targets …
g++ -o main.o -c -I /opt/ros/noetic/include/ -I /home/liuj/1_Data/5_ros_example/ros1/devel/include -I/home/liuj/1_Data/5_ros_example/ros1/src/1_ros_基础/21_ros动态库/lib_test/include/ -ggdb3 -O0 -DDEBUG main.cpp
g++ -o main.out -Wl,–copy-dt-needed-entries -Wl,-rpath=/opt/ros/noetic/lib -Wl,-rpath=/home/liuj/1_Data/5_ros_example/ros1/devel/lib main.o -L/opt/ros/noetic/lib -L/home/liuj/1_Data/5_ros_example/ros1/devel/lib -lroscpp -lrosconsole -llib_test
scons: done building targets.

最终使用效果:
提示5%开发效率, 减少ros1 catkin_make的编译时间.

提示:更高的效率
将gcc g++编译器改为clang clang++, 编译时间减少20%.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值