IDL컴파일러

IDL 컴파일러에 관해서

MICO IDL

컴파일러명 : idl
/usr/local/bin/idl, /usr/bin/idl 등.
그것의 이름을 사용하는 것은 그만두면 좋겠다.
무엇인가 prefix를 붙이면 좋은 것이다.
옵션: 예 idl --c++-skel --poa --no-boa RTCPackage.idl
C++로 보통으로 사용하려면 이 정도로 OK.
 > idl -h
 unknown option: -h
 usage: idl [<options>] [<file>]
 possible <options> are:
    --help
    --version
    --config
    --feed-ir
    --feed-included-defs
    --do-not-feed-included-defs
    --no-exceptions
    --codegen-c++
    --no-codegen-c++
    --codegen-idl
    --no-codegen-idl
    --codegen-midl
    --no-codegen-midl
    --cpp < cpp >
    --c++-suffix <filename-suffix>
    --c++-impl
    --c++-skel
    --codegen-wsdl
    --no-codegen-wsdl
    --hh-suffix <filename-suffix>
    --relative-paths
    --emit-repoids
    --do-not-query-server-for-narrow
    --repo-id <repository-id>
    --name <filename-prefix>
    --wsdl-map <filename>
    --ifdef-prefix <prefix>
    --poa
    --no-poa
    --boa    --    (deprecated)
    --no-boa
    --no-poa-ties
    --no-poa-stubs
    --pseudo
    --any
    --typecode
    --windows-dll <dll-prefix>
    --windows-dll-with-export <dll-prefix>
    --mico-core
    --gen-included-defs
    --gen-full-dispatcher
    --missing-nscorba
    --not-missing-nscorba
    --support-id
    --dont-support-id
    --wsi-wsdl
    --no-wsi-wsdl
    --include-prefix <include-prefix>
^L 를 받아들이지 않는다
개페이지의^L가 IDL 소스중에 있으면 접수 없다.
omniidl 에서는 그대로 통하는데….

omniORB

TAO IDL

gperf 문제
gperf 는 TAO 부속의 gperf 를 사용할 필요 있어.FreeBSD에서는 /usr/bin/gperf (시스템에 부속인가?)(와)과 /usr/local/bin/gperf(TAO 부속)가 있다.
디폴트에서는 $ACE_ROOT/bin/gperf 를 사용하기 위해, 환경 변수 ACE_ROOT를 설정하는지, 옵션 -g ::<gperf_path> 를 설정해야 한다.
TAO_ROOT
환경 변수 TAO_ROOT 가 설정되어 있지 않으면 TAO가 제공하는 IDL를 읽어들일 수 없다.
게다가 TAO 의 ORB의 IDL (ex. /usr/local/include/tao/orb.idl)를 인클루드

 #include <orb.idl>
하지 않으면 TypeCode등이 사용할 수 없다.
 #ifdef TAO_IDL
 #include <orb.idl>
 #endif
등으로 해서, 다른 IDL 컴파일러와 나눌 필요 있어.

ORBit2 idl

컴파일러명 : orbit-idl-2
ORBit는 디폴트에서는 C언어로 코딩 하게 되어 있다.
헬프

 Usage: orbit-idl-2 [-D|-define STRING] [-I|-include STRING] [--libIDL-version]
        [-v|--version] [-l|--lang STRING] [-d|--debug INT] [--idlwarnlevel=INT]
        [--showcpperrors] [--nostubs] [--noskels] [--nocommon]
        [--noheaders] [--noidata] [-i|--imodule] [--add-imodule]
        [--skeleton-impl] [--backenddir=DIR] [--c-output-formatter=PROGRAM]
        [--onlytop] [--pidl] [--nodefskels] [--deps=FILENAME]
        [--headerguardprefix=STRING] [--output-dir=STRING] [-?|--help]
        [--usage] <IDL files>

옵션
-l or --lang 로 cpp를 지정하면 C++의 코드를 생성한다.

다만, C의 코드를 사용하고 있으므로, C의 코드도 생성해 두지 않으면 안 된다.orz...

 orbit-idl-2 RTCPackage.idl
 orbit-idl-2 -lcpp RTCPackage.idl

이것에 의해,

 RTCPackage-common.c
 RTCPackage.h
 RTCPackage-cpp-common.cc
 RTCPackage-cpp-common.h
 RTCPackage-cpp-skels.cc
 RTCPackage-cpp-skels.h
 RTCPackage-cpp-stubs.cc
 RTCPackage-cpp-stubs.h
 RTCPackage-cpp.cc
 RTCPackage-cpp.h
하지만 생성된다.xxx-cpp.cc 가 모든 소스를 내부에서 include 하고 있으므로, 스켈리턴과 그루터기의 양쪽 모두가 필요하면 이 소스만 컴파일 하면 좋다.

  • orbit-idl-2 의 문제 struct 안에 Object reference 의 순서를 넣으면 스켈리턴의 컴파일이 통하지 않는다.
     struct ComponentProfile
     {
        PortProfileList inport_profile_list;
        PortProfileList outport_profile_list;
        ServiceProfileList service_profile_list;
        ServiceProfileList consumer_profile_list;
        RTC parent;
        RTCList children; // × typedef 한 Object ref 의 sequence는 안되
        sequence<RTC> children; // × typedef는 관계없다
        sequence<RTC,100> children; // × bounded sequence 도 안되
        sequence<short> children; // ○ Object ref 가 아니면 OK
     };

ダウンロード

最新バージョン : 2.1.0-RELESE

統計

Webサイト統計
ユーザ数:3399
プロジェクト統計
RTコンポーネント309
RTミドルウエア35
ツール25
文書・仕様書2

OpenRTM@Github

OpenRTM-aist GitHubサイト

ROS

Robot Operating System

Choreonoid

モーションエディタ/シミュレータ

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク

産総研が提供するRTC集

東京オープンソースロボティクス協会