OpenDDS制作编译idl文件之一

本文详细介绍了IDL(接口描述语言)在OpenDDS中的应用流程,从IDL文件的结构和定义,到编译IDL文件生成C++代码,再到编辑mpc文件构建项目,最后解决编译过程中的常见错误。

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

1.介绍

IDL(接口描述语言)是一种使用类似C ++风格定义结构的文本文件。该文件包含必须交换的数据结构。结构由struct关键字定义;

IDL文件使用DCPS_DATA_TYPE定义一个结构体数据类型,OpenDDS要求数据类型必须是一个结构体,并且是以#pragma的方式进行传输的,以idl文件形式存在。

使用DCPS_DATA_KEY定义了一个数据类型的键。一种数据类型可能有0个或多个键。这些键用于区分同一个主题内的不同实体。

注意:IDL中左侧大括号不能另起一行,必须与代码同行

#ifndef _TRANSLATEDATA_IDL_
#define _TRANSLATEDATA_IDL_
module TranslateData{
	#pragma DCPS_DATA_TYPE "TranslateData::TranslateJsonData"
	struct TranslateJsonData{
		string jsonData;
	};
};
#endif


2.编译

2.1.tao_idl.exe TranslateData.idl

假设系统的环境变量已经配置完成;
运行VS2013命令行,进入到idl文件所在的目录下:
在这里插入图片描述
运行命令:

tao_idl.exe TranslateData.idl

在这里插入图片描述
运行完成之后,目录下面对多出5个文件

*C.cpp  *C.h  *C.inl  *S.cpp  *S.h 

*C是客户端代码,*S是服务端代码

2.1.opendds_idl.exe TranslateData.idl

直接在此运行命令:

opendds_idl.exe TranslateData.idl

在这里插入图片描述
目录下面会多出三个文件:

*TypeSupport.idl  *TypeSupport.cpp  *TypeSupport.h

3.编辑mpc文件

在这里插入图片描述

project(*Common) : dcps {
  sharedname     = TranslateDataCommon //DLL名称
  dynamicflags   = TRANSLATESATACOMMON_BUILD_DLL //宏定义

  libout         = .
  requires += tao_orbsvcs
  requires += no_opendds_safety_profile
  after    += Svc_Utils
  includes      += $(TAO_ROOT)/orbsvcs
  idlflags      += -I$(TAO_ROOT)/orbsvcs \
                   -Wb,export_macro=TranslateDataCommon_Export \
                   -Wb,export_include=TranslateDataCommon_Export.h
  dcps_ts_flags += -Wb,export_macro=TranslateDataCommon_Export

  TypeSupport_Files {
    TranslateData.idl
  }

  IDL_Files {
    TranslateDataTypeSupport.idl
    TranslateData.idl
  }

  // We only want the generated files
  Header_Files {
	//TranslateDataCommon_Export.h
  }

  // We only want the generated files
  Source_Files {
  }
}

使用perl进行编译mpc文件,输入命令:

perl F:\DDS\ACE_wrappers\bin\mwc.pl -type vc12

使用mwc.pl的完整路径,
-type vc12:表明编译环境是VS2013
在这里插入图片描述
VS2013工程文件就编译好了:
在这里插入图片描述
如果没有成功,则要看一下,系统环境变量有没有设置完成,以下四个系统环境变量必须设置,否则会出现问题:

ACE_ROOT
DDS_ROOT
MPC_ROOT
TAO_ROOT

用VS2013打开sln文件,编译Release版本,然后编译,出现错误:

fatal error C1083: 无法打开包括文件: “TranslateDataCommon_Export.h”: No such file or directory

新建一个TranslateDataCommon_Export.h文件:

// Definition for Win32 Export directives.
// This file is generated automatically by generate_export_file.pl TranslateJsonData
// ------------------------------


#ifndef TRANSLATEJSONDATA_EXPORT_H
#define TRANSLATEJSONDATA_EXPORT_H

#include "ace/config-all.h"

#if defined (ACE_AS_STATIC_LIBS) && !defined (TRANSLATEJSONDATA_HAS_DLL)
#  define TRANSLATEJSONDATA_HAS_DLL 0
#endif /* ACE_AS_STATIC_LIBS && TRANSLATEJSONDATA_HAS_DLL */

#if !defined (TRANSLATEJSONDATA_HAS_DLL)
#  define TRANSLATEJSONDATA_HAS_DLL 1
#endif /* ! TRANSLATEJSONDATA_HAS_DLL */

#if defined (TRANSLATEJSONDATA_HAS_DLL) && (TRANSLATEJSONDATA_HAS_DLL == 1)
#  if defined (TRANSLATEJSONDATA_BUILD_DLL)
#    define TranslateDataCommon_Export ACE_Proper_Export_Flag
#    define TRANSLATEJSONDATA_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION(T)
#    define TRANSLATEJSONDATA_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
#  else /* TRANSLATEJSONDATA_BUILD_DLL */
#    define TranslateDataCommon_Export ACE_Proper_Import_Flag
#    define TRANSLATEJSONDATA_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION(T)
#    define TRANSLATEJSONDATA_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
#  endif /* TRANSLATEJSONDATA_BUILD_DLL */
#else /* TRANSLATEJSONDATA_HAS_DLL == 1 */
#  define TranslateDataCommon_Export
#  define TRANSLATEJSONDATA_SINGLETON_DECLARATION(T)
#  define TRANSLATEJSONDATA_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
#endif /* TRANSLATEJSONDATA_HAS_DLL == 1 */

// Set TRANSLATEJSONDATA_NTRACE = 0 to turn on library specific tracing even if
// tracing is turned off for ACE.
#if !defined (TRANSLATEJSONDATA_NTRACE)
#  if (ACE_NTRACE == 1)
#    define TRANSLATEJSONDATA_NTRACE 1
#  else /* (ACE_NTRACE == 1) */
#    define TRANSLATEJSONDATA_NTRACE 0
#  endif /* (ACE_NTRACE == 1) */
#endif /* !TRANSLATEJSONDATA_NTRACE */

#if (TRANSLATEJSONDATA_NTRACE == 1)
#  define TRANSLATEJSONDATA_TRACE(X)
#else /* (TRANSLATEJSONDATA_NTRACE == 1) */
#  if !defined (ACE_HAS_TRACE)
#    define ACE_HAS_TRACE
#  endif /* ACE_HAS_TRACE */
#  define TRANSLATEJSONDATA_TRACE(X) ACE_TRACE_IMPL(X)
#  include "ace/Trace.h"
#endif /* (TRANSLATEJSONDATA_NTRACE == 1) */

#endif /* TRANSLATEJSONDATA_EXPORT_H */

// End of auto generated file.

再次编译,就成功了,当前目录下面就生成了dll和lib文件。
在这里插入图片描述

aaa

### 使用 OpenDDS IDL 编译器生成 DDS 代码的方法 OpenDDS 提供了一个强大的工具链来处理 IDL 文件并生成相应的 C++ 或其他目标语言的代码。以下是关于如何使用 OpenDDS IDL 编译器生成 DDS 代码的相关说明。 #### 工具位置与调用方式 OpenDDS IDL 编译器可以通过 `opendds_idl` 可执行文件访问,该文件通常位于 `$DDS_ROOT/bin/` 路径下,并已添加到系统的 PATH 环境变量中[^1]。如果环境配置正确,则可以直接通过命令行调用此工具。 #### 构建系统集成 尽管可以手动调用 IDL 编译器,但在实际开发过程中更推荐依赖构建系统自动完成这一过程。OpenDDS 支持两种主要的构建系统:MPC 和 CMake[^2]。对于 MPC,开发者需要创建 `.mpc` 配置文件,并运行脚本将其转换为目标平台的构建文件(如 Visual Studio 解决方案)。例如,在 Windows 上可以使用以下命令: ```bash E:\OpenDDS-3.13>mwc.pl -type vs2017 UserManager.mpc ``` 上述命令会根据指定的 `.mpc` 文件生成适用于 Visual Studio 2017 的解决方案文件[^4]。 #### 自动生成流程概述 当采用构建系统时,IDLC(即 opendds_idl)会被作为构建的一部分自动触发。这意味着无需显式地单独运行 IDL 编译器;只需确保项目的构建配置正确无误即可实现 IDL 到目标代码的转化。 #### 手动编译情况下的基本语法 假如确实需要独立操作 IDL 编译器,其基础命令结构如下所示: ```bash opendds_idl [options...] input_file.idl ``` 其中 `[options...]` 表示各种可能的选项参数列表,而 `input_file.idl` 是待解析的接口定义文件名。 #### 示例代码片段展示 下面给出一段简单的 Python 脚本来演示如何自动化调用 OpenDDS IDL 编译器的过程。 ```python import subprocess def compile_idl(idl_path, output_dir): command = [ 'opendps_idl', '-d', output_dir, idl_path ] result = subprocess.run(command, capture_output=True, text=True) if result.returncode != 0: raise Exception(f"Failed to compile {idl_path}: {result.stderr}") compile_idl('example.idl', './generated_code') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值