Windows下VC编译OpenDDS
OpenDDS是一个OMG组织DDS标准的C++开源实现,OpenDDS同时也提供Java支持。OpenDDS依赖ACE抽象层来提供不同平台的兼容性,同时也依赖于TAO(例如TAO的IDL编译器)。当前OpenDDS有ociweb ObjectComputing维护,官方网站http://www.opendds.org/。目前OpenDDS支持的平台有Windows,Linux family,Android,VxWorks等,可用的编译器包括VC,gcc,QNX gcc等。
1. OpenDDS编译准备
OpenDDS如上文所述依赖TAO(TAO依赖于ACE),同时也依赖Perl。Perl在OpenDDS的作用是1. 运行自动测试脚本或OpenDDS例程 2. MPC依赖于Perl生成Makefiles或者VC项目文件。所以编译OpenDDS的第一步需要建立OpenDDS依赖的环境即:编译TAO+ACE、配置Perl环境。
a. TAO+ACE
因为TAO依赖ACE,在ACE之上,所以最好捆绑下载配套的ACE+TAO发布版本。ACE+TAO的下载网站http://download.dre.vanderbilt.edu/,下载最新版本的ACE+TAO.zip。网站下载有两种版本可供选择Full版和Sources Only版,Full指的是项目文件已经生成的版本(包括GNUMakefiles和VC项目文件),Sources Only版本仅仅包含源代码,需要自己使用MPC生成makefile。
b. Perl
Windows环境下,可下载ActiveState Perl。
c. OpenDDS
OpenDDS下载地址http://download.ociweb.com/OpenDDS/。
2. 安装Perl
3. 编译TAO+ACE
编译TAO+ACE可参考http://www.dre.vanderbilt.edu/~schmidt/DOC_ROOT/TAO/TAO-INSTALL.html。
a. 解压ACE+TAO-6.2.6.zip,我的解压路径是D:\。
b. 设置相关环境变量
ACE_ROOT设置为zip解压后的根目录,我的为D:\ACE_wrappers;
TAO_ROOT设置为%ACE_ROOT%\TAO,我的为D:\ACE_wrappers\TAO;
PATH添加%ACE_ROOT%\lib和%ACE_ROOT%\bin。
c. 设置config.h
于%ACE_ROOT%/ace下新建一个配置文件config.h,内容为#include “ace/config-win32.h”。
d. 编译
分别打开%ACE_ROOT%\ACE.sln和%TAO_ROOT%\ACE_TAO.sln,依次进行编译。根据解决方案文件名可以得知解决方案对应的VC版本。
Platform
File Name
VC7.1
name_vc71
VC8 for desktop/server
name_vc8
VC8 for Windows CE/Mobile
name_WinCE
VC9 for desktop/server
name_vc9
VC10 for desktop/server
name_vc10
VS2012
name_vc11
也可以使用VS命令行工具进行编译。Debug版本和Release版本的编译命令分别如下:
msbuild ACE_vc11.sln /p:Configuration=Debug > build_ace_debug.log msbuild ACE_vc11.sln /p:Configuration=Release > build_ace_debug.log msbuild ACE_TAO_vc11.sln /p:Configuration=Debug > build_tao_debug.log msbuild ACE_TAO_vc11.sln /p:Configuration=Release > build_tao_debug.log
4. 编译OpenDDS
a. 解压OpenDDS压缩文件,我的解压路径是D:\
b. 设置相关环境变量
设置%DDS_ROOT%为OpenDDS解压后的根目录,我的为D:\DDS;
PATH添加% DDS_ROOT %\lib和% DDS_ROOT %\bin。
c. 编译OpenDDS
打开DDS.sln进行编译。文件名与编译器版本的对应关系与TAO相同。
NOTE: OpenDDS不提供VS2012版本的工程文件,所以使用VS2012或更高版本的IDE打开解决方案文件时,需要更新解决方案与项目文件。但是在更新过程中有可能出错,我遇到的是pre include路径变成乱码的错误,需要重新更新一下。当然最好的办法是直接使用对应的版本编译。
可以使用VS命令行工具进行编译。命令如下:
msbuild DDS_vc10.sln /p:Configuration=Debug > build_dds_debug.log
msbuild DDS_vc10.sln /p:Configuration=Release > build_dds_debug.log
5. 运行测试脚本
编译完成之后,可以运行测试脚本观察是否OpenDDS环境是否搭建成功。切换到D:\DDS\examples\DCPS\Messenger_Imr目录,运行run_test.pl
D:\DDS\examples\DCPS\Messenger_Imr>.\run_test.pl > test.log
test.log内容如下:
>>> D:\ACE_wrappers\TAO\orbsvcs\ImplRepo_Service\.\tao_imr_locator.EXE -o imr.ior -orbendpoint iiop://:15021 >>> D:\ACE_wrappers\TAO\orbsvcs\ImplRepo_Service\.\tao_imr_activator.EXE -o activator.ior -ORBInitRef ImplRepoService=file://imr.ior -orbendpoint iiop://:14908 >>> D:\DDS\bin\.\DCPSInfoRepo.EXE -NOBITS -o repo.ior -ORBuseimr 1 -ORBInitRef ImplRepoService=file://imr.ior >>> D:\ACE_wrappers\bin\tao_imr.EXE -ORBInitRef ImplRepoService=file://imr.ior shutdown InfoRepo >>> D:\ACE_wrappers\bin\tao_imr.EXE -ORBInitRef ImplRepoService=file://imr.ior update InfoRepo -l WJY -c "D:\DDS\bin\.\DCPSInfoRepo.EXE -NOBITS -o repo.ior -ORBuseimr 1 -ORBInitRef ImplRepoService=file://imr.ior" >>> D:\ACE_wrappers\bin\tao_imr.EXE -ORBInitRef ImplRepoService=file://imr.ior list -v .\.\publisher.EXE -DCPSConfigFile pub.ini -orbendpoint iiop://:16309 .\.\subscriber.EXE -DCPSConfigFile sub.ini Message: subject = Review subject_id = 99 from = Comic Book Guy count = 0 text = Worst. Movie. Ever. SampleInfo.sample_rank = 0 Message: subject = Review subject_id = 99 from = Comic Book Guy count = 1 text = Worst. Movie. Ever. SampleInfo.sample_rank = 0 Message: subject = Review subject_id = 99 from = Comic Book Guy count = 2 text = Worst. Movie. Ever. SampleInfo.sample_rank = 0 Message: subject = Review subject_id = 99 from = Comic Book Guy count = 3 text = Worst. Movie. Ever. SampleInfo.sample_rank = 0 Message: subject = Review subject_id = 99 from = Comic Book Guy count = 4 text = Worst. Movie. Ever. SampleInfo.sample_rank = 0 Message: subject = Review subject_id = 99 from = Comic Book Guy count = 5 text = Worst. Movie. Ever. SampleInfo.sample_rank = 0 Message: subject = Review subject_id = 99 from = Comic Book Guy count = 6 text = Worst. Movie. Ever. SampleInfo.sample_rank = 0 Message: subject = Review subject_id = 99 from = Comic Book Guy count = 7 text = Worst. Movie. Ever. SampleInfo.sample_rank = 0 Message: subject = Review subject_id = 99 from = Comic Book Guy count = 8 text = Worst. Movie. Ever. SampleInfo.sample_rank = 0 Message: subject = Review subject_id = 99 from = Comic Book Guy count = 9 text = Worst. Movie. Ever. SampleInfo.sample_rank = 0 >>> D:\ACE_wrappers\bin\tao_imr.EXE -ORBInitRef ImplRepoService=file://imr.ior shutdown InfoRepo test PASSED.测试通过。
参考文章:
http://www.dre.vanderbilt.edu/~schmidt/DOC_ROOT/ACE/ACE-INSTALL.html#win32
http://www.dre.vanderbilt.edu/~schmidt/DOC_ROOT/TAO/TAO-INSTALL.html