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