OpenDDS项目中使用CMake构建系统的完整指南
概述
OpenDDS是一个开源的分布式数据服务(DDS)实现,它遵循OMG DDS规范。本文将详细介绍如何在OpenDDS项目中使用CMake构建系统,帮助开发者快速上手并理解关键概念。
CMake集成基础
前置条件
- CMake 3.3.2或更高版本(某些功能需要更新版本)
- 已正确配置OpenDDS开发环境(通过setenv.sh或setenv.cmd)
基本使用流程
- 在项目中通过
find_package(OpenDDS REQUIRED)加载OpenDDS CMake包 - 使用
opendds_target_sources添加IDL文件 - 链接必要的OpenDDS库
快速入门示例
Messenger示例
这是OpenDDS开发者指南中的经典示例,展示了基本的CMake集成方式:
# 查找OpenDDS包
find_package(OpenDDS REQUIRED)
# 创建IDL类型支持库
add_library(Messenger_idl)
opendds_target_sources(Messenger_idl
Messenger.idl
TAO_IDL_OPTIONS -Sa -St
OPENDDS_IDL_OPTIONS -Lc++11
)
# 定义发布者应用程序
add_executable(publisher publisher.cpp)
target_link_libraries(publisher ${opendds_libs})
# 定义订阅者应用程序
add_executable(subscriber subscriber.cpp)
target_link_libraries(subscriber ${opendds_libs})
构建步骤
在Linux/macOS上:
source setenv.sh
cd DevGuideExamples/DCPS/Messenger
mkdir build
cd build
cmake ..
cmake --build .
perl run_test.pl
在Windows上:
call setenv.cmd
cd DevGuideExamples\DCPS\Messenger
mkdir build
cd build
cmake ..
cmake --build .
perl run_test.pl
高级配置选项
组件系统(3.25+版本)
OpenDDS CMake包支持组件化的查找机制:
find_package(OpenDDS REQUIRED
OpenDDS::Rtps_Udp
OpenDDS::RtpsRelay
built_in_topics
safety_profile=OFF
)
可用的组件类型包括:
- 可执行文件(如OpenDDS::opendds_idl)
- 库(如OpenDDS::Security)
- 特性(如safety_profile)
自定义安装位置
可以将OpenDDS安装到自定义位置:
OPENDDS_PREFIX="$PWD/opendds-install"
./configure --prefix="$OPENDDS_PREFIX"
make install
然后在CMake项目中通过CMAKE_PREFIX_PATH引用:
cmake -DCMAKE_PREFIX_PATH="$OPENDDS_PREFIX" ..
核心功能详解
IDL文件处理
opendds_target_sources是处理IDL文件的核心函数,支持多种选项:
opendds_target_sources(MyTarget
MyInterface.idl
TAO_IDL_OPTIONS -Sa -St
OPENDDS_IDL_OPTIONS -Lc++11
SUPPRESS_ANYS FALSE
AUTO_LINK TRUE
)
关键选项说明:
TAO_IDL_OPTIONS: 传递给tao_idl的选项OPENDDS_IDL_OPTIONS: 传递给opendds_idl的选项SUPPRESS_ANYS: 控制是否生成any类型的TypeCodeAUTO_LINK: 自动链接必要的OpenDDS库
库链接
OpenDDS提供了多个库目标,常用的包括:
set(opendds_libs
OpenDDS::Dcps
OpenDDS::Rtps
OpenDDS::Rtps_Udp
OpenDDS::Security
)
target_link_libraries(my_app ${opendds_libs})
部署考虑
运行时组件安装
CMake 3.21+支持安装导入的运行时组件:
install(IMPORTED_RUNTIME_ARTIFACTS
OpenDDS::DCPSInfoRepo
OpenDDS::RtpsRelay
DESTINATION bin
)
接口文件安装
可以安装生成的接口文件供下游项目使用:
install(FILES
$<TARGET_PROPERTY:Messenger_idl,OPENDDS_IDL_INTERFACE_FILES>
DESTINATION include
)
常见问题解决
Clang下的SONAME问题
使用Clang构建时,可能需要手动添加SONAME:
- 编辑
$ACE_ROOT/include/makeinclude/platform_macros.GNU - 添加:
SOFLAGS+=-Wl,-h,$(SONAME) - 重新构建OpenDDS
多目标IDL处理
从3.32版本开始,支持在不同目标中使用相同的IDL文件但不同选项:
opendds_target_sources(TargetA My.idl OPENDDS_IDL_OPTIONS -Lc++11)
opendds_target_sources(TargetB My.idl OPENDDS_IDL_OPTIONS -Lc++03)
最佳实践
- 版本控制:明确指定所需的OpenDDS版本
- 组件化:只请求实际需要的组件
- 导出头管理:合理使用
USE_EXPORT选项 - 构建隔离:为不同构建类型(Debug/Release)使用不同目录
- 依赖管理:利用
opendds_get_library_dependencies确保完整依赖
通过本文介绍的方法,开发者可以高效地在OpenDDS项目中使用CMake构建系统,充分利用现代构建工具的优势,简化项目配置和管理工作。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



