最近做网管北向接口,用了官方的 idl ,结果出现一堆问题。所有问题解决花了我快一个星期,因此把我的经验介绍给大家。
问题一: 神秘的 OMGidl 文件夹
官方的TMF814_v3.5 idl文件有个 OMGidl 文件夹,点进去一看,这不是CORBA的核心代码嘛。一开始不敢改,就硬着头皮编译,结果出问题了,因为用CORBA 就必须使用 TAOd.lib 和相关的几个库。编译不过,然后对比了下 TAO 的那些代码,发现 OMGidl 文件夹 里的文件最后修改时间有 2001年 的有2003年的,最多的是2006年的。TAO里的代码都是 2014年的。OMGidl 文件夹里的文件太老了。
然后弃用OMGidl的文件,然后把其他的idl中凡是引用了OMGidl的文件的,比如:
#include "OMGidl/CosNotification.idl"
改成
#include "CosNotification.idl"
然后直接用TAO的idl,这样tao_idl 编译时要如下编写:
tao_idl %inputFile% -I%TAO_ROOT%\orbsvcs\orbsvcs -o %outputDir%
这样编译就完成了。但是问题来了链接出错。
问题二: 奇怪的链接错误,多重定义。
<span style="color: rgb(34, 34, 34); font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 15px; line-height: 20px;"></span><pre name="code" class="html" style="text-align: left;">TAO.lib(TAO.dll) : error LNK2005: "public: void __thiscall TAO::unbounded_value_sequence<int>::length(unsigned int)"
<pre name="code" class="html">(?length@?$***@H@TAO@@***@Z) already defined in simpleC.obj
<pre name="code" class="html">TAO.lib(TAO.dll) : error LNK2005: "public: void __thiscall TAO::unbounded_basic_string_sequence<wchar_t>::length(unsigned int)" (?length@?$***@_W@TAO@@***@Z) already defined in simpleC.obj
看到这个的童鞋是不是有心碎的赶脚。这是怎么回事。
后来,历经千辛万苦,终于在国外的网站上发现了高人的指点。
把所有出现重定义的idl文件里,在最前面(所有 #include 的前面 #ifdefine后面)加上如下:
#include "orb.idl"
然后,编译,然后这个世界清静了。
最后,终于知道为什么OMGidl 文件夹里有代一个orb.idl。他们一定知道这是个坑。
原文链接: https://groups.yahoo.com/neo/groups/tao-users/conversations/topics/22164