天天看點

OpenDDS制作編譯idl檔案之一

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檔案所在的目錄下:

OpenDDS制作編譯idl檔案之一

運作指令:

tao_idl.exe TranslateData.idl
           
OpenDDS制作編譯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
           
OpenDDS制作編譯idl檔案之一

目錄下面會多出三個檔案:

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

3.編輯mpc檔案

OpenDDS制作編譯idl檔案之一
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

OpenDDS制作編譯idl檔案之一

VS2013工程檔案就編譯好了:

OpenDDS制作編譯idl檔案之一

如果沒有成功,則要看一下,系統環境變量有沒有設定完成,以下四個系統環境變量必須設定,否則會出現問題:

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檔案。

OpenDDS制作編譯idl檔案之一

aaa

繼續閱讀