You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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头文件
  • 核心疑问分为两点:
    1. 示例代码附带原生Makefile,如何将其编译参数适配到ROS包的CMakeLists.txt中
    2. 如何修改CMakeLists.txt配置,让编译流程可以正常访问SDK的头文件、库文件等依赖资源

示例自带原生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,按以下顺序修改:

  1. 依赖导入段(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)
    
  2. 编译参数配置段(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})
    
  3. 编译目标配置段(文件末尾添加即可)
    # 声明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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 23:57:16