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%.