C++ ROS包集成Lucam SDK的CMakeLists.txt配置问题
问题背景
- 运行环境:Teledyne Lumenera USB相机,Ubuntu 18.04系统,已安装Linux版本
lucam-sdk_2.4.3.94 - SDK结构说明:
- 根目录下
api文件夹存放核心接口文件 - 内置
example文件夹提供多组功能示例(覆盖对焦设置、相机信息读取等场景),每个示例独立文件夹包含.cpp源文件、.h头文件、独立make编译脚本
- 根目录下
- 开发目标:基于该SDK开发C++ ROS节点,操作流程为在
catkin_ws/src路径下创建ROS包,将SDK示例代码复制到ROS包的src目录后,执行catkin_make时编译器报错,无法识别SDK内的lucamapi.h头文件 - 核心疑问分为两点:
- 示例代码附带原生Makefile,如何将其编译参数适配到ROS包的
CMakeLists.txt中 - 如何修改
CMakeLists.txt配置,让编译流程可以正常访问SDK的头文件、库文件等依赖资源
- 示例代码附带原生Makefile,如何将其编译参数适配到ROS包的
示例自带原生Makefile内容如下:
# CC = g++ LD = $(CC) ifndef ARCH ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/ -e s/x86_64/x86-64/) endif LU_LDFLAGS = -lm -lpthread -lstdc++ PROG = livePreview VERSION = 0.1 INCLUDES = $(LUMENERA_SDK)/include CFLAGS = -DVERSION=\"$(VERSION)\" -I$(INCLUDES) -g CFLAGS += -DLUMENERA_LINUX_API OBJS = ALL_INCLUDES = all lu: $(PROG) clean: rm -f $(PROG) *.o *.core core *.bak *~ livePreview: verify_environment livePreview.o Camera.o $(LD) livePreview.o Camera.o `pkg-config --libs opencv` -llucamapi $(LU_LDFLAGS) -o $@ verify_environment: @if test "$(LUMENERA_SDK)" = "" ; then \ echo "LUMENERA_SDK environment variable is not set!"; \ exit 1; \ fi Camera.o: Camera.cpp $(INCLUDES)/lucamapi.h $(CC) $(CFLAGS) -c Camera.cpp livePreview.o: livePreview.cpp $(INCLUDES)/lucamapi.h $(CC) $(CFLAGS) -c livePreview.cpp
解决方案
一、原生Makefile参数适配逻辑
不需要保留原Makefile的自定义目标(比如clean、verify_environment、自动架构识别的冗余逻辑),catkin编译系统会自动处理编译清理、架构适配,只需要提取编译必须的核心参数,映射到CMakeLists.txt的对应字段即可:
- 必须保留的预定义宏:
VERSION="0.1"、LUMENERA_LINUX_API - 必须配置的头文件搜索路径:SDK目录下的
include文件夹 - 必须链接的依赖库:
lucamapi、OpenCV、m、pthread、stdc++ - 必须加入编译列表的源文件:示例目录下的
livePreview.cpp、Camera.cpp
二、CMakeLists.txt完整配置步骤
前置校验
终端执行echo $LUMENERA_SDK,确认能正常输出SDK的绝对安装路径;如果无输出,先在~/.bashrc中追加SDK路径的环境变量配置,执行source ~/.bashrc生效。
逐段修改配置
打开ROS包根目录下的CMakeLists.txt,按以下顺序修改:
- 依赖导入段(cmake最低版本、project声明之后)
# 保留原有ROS依赖配置 find_package(catkin REQUIRED COMPONENTS roscpp # 自行补充其他用到的ROS依赖包,比如sensor_msgs、cv_bridge等 ) # 导入OpenCV依赖,对应原Makefile的pkg-config opencv配置 find_package(OpenCV REQUIRED) # 读取LUMENERA_SDK环境变量,和原Makefile的环境变量校验逻辑对齐 set(LUMENERA_SDK_PATH $ENV{LUMENERA_SDK}) if(NOT LUMENERA_SDK_PATH) message(FATAL_ERROR "LUMENERA_SDK environment variable is not set!") endif() # 配置SDK头文件、库文件路径,如果头库存放在api子目录下,对应调整路径即可 set(LUMENERA_INCLUDE_DIRS ${LUMENERA_SDK_PATH}/include) # *注意:x86_64架构下库文件默认存放在SDK的lib/x86-64目录,和原Makefile的架构识别逻辑对应,其他架构请替换为对应库目录* set(LUMENERA_LIB_DIRS ${LUMENERA_SDK_PATH}/lib/x86-64) - 编译参数配置段(catkin_package声明之后)
catkin_package( # 保留原有catkin包配置 ) # 加入所有头文件搜索路径 include_directories( ${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ${LUMENERA_INCLUDE_DIRS} # 若ROS包自有头文件存放在include目录,也一并加入 ) # 追加原Makefile定义的编译宏 add_definitions(-DVERSION="0.1" -DLUMENERA_LINUX_API) # 加入SDK库文件搜索路径 link_directories(${LUMENERA_LIB_DIRS}) - 编译目标配置段(文件末尾添加即可)
# 声明ROS可执行节点,把所有需要编译的cpp文件列全,和原Makefile的编译目标对齐 add_executable(lumenera_camera_node src/livePreview.cpp src/Camera.cpp ) # 按顺序链接所有依赖库 target_link_libraries(lumenera_camera_node ${catkin_LIBRARIES} ${OpenCV_LIBS} lucamapi m pthread stdc++ )
常见问题排查
- 编译时提示找不到
lucamapi.h:检查LUMENERA_INCLUDE_DIRS配置的路径下是否存在该头文件,部分版本SDK的头文件存放在api/include子目录,对应调整路径即可 - 编译时提示找不到
liblucamapi.so:检查LUMENERA_LIB_DIRS配置的路径下是否存在对应动态库文件,注意区分32位、64位库目录 - 运行节点时提示库加载失败:将SDK库目录绝对路径写入
/etc/ld.so.conf.d/lumenera.conf,执行sudo ldconfig刷新系统库缓存即可
内容的提问来源于stack exchange,提问作者CVDE
相关产品推荐
相关产品推荐

