1.1 环境
- Linux:Ubuntu 16.04LTS
- Perl:V5.22.1
- Make:GNU Make V4.1
- gcc:V5.4.0
1.2 下载ACE+TAO与OpenDDS
ACE+TAO下载地址:http://download.dre.vanderbilt.edu/
OpenDDS下载地址:http://download.ociweb.com/OpenDDS/
下载时注意:
- ACE+TAO下载选择
FULL
版本。
FULL版本:包含所有GNU make
预生成makefile
的源代码;
Sources only版本:仅包含源代码,需要使用MPC
生成makefile
。 - Linux下选择
*.tar.gz
格式,Windows下选择*.zip
格式。
1.3 解压安装ACE+TAO与OpenDDS
将ACE+TAO与OpenDDS解压至/DevOpenDDS
目录下
sudo tar -zxvf ACE+TAO-6.5.12.tar.gz -C /DevOpenDDS
sudo tar -zxvf OpenDDS-3.15.tar.gz -C /DevOpenDDS
解压完毕后,在/
DevOpenDDS目录下已存在ACE_wrappers
和OpenDDS
两个文件夹,修改其权限
(这步很有必要,不修改权限会在编译时出现Permission denied
的情况)
cd /DevOpenDDS
sudo chmod 777 -R ACE_wrappers/
sudo chmod 777 -R OpenDDS/
1.4 设置相关环境变量
在/etc/profile
文件尾添加如下环境变量,重启生效
(之前有博客说在.bashrc里添加环境变量,我在编译的时候,总是报"找不到目录",以上红色文字部分才解决了这个问题。)
# ACE+TAO+DDS Environment
export ACE_ROOT=/home/jamie/DevOpenDDS/ACE_wrappers
export TAO_ROOT=$ACE_ROOT/TAO
export DDS_ROOT=/home/jamie/DevOpenDDS/OpenDDS
export PATH=$ACE_ROOT/bin:$DDS_ROOT/bin:$PATH
export LD_LIBRARY_PATH=$ACE_ROOT/lib:$DDS_ROOT/lib:$LD_LIBRARY_PATH
以上绿色路径部分,需要根据实际的路径进行调整。
二、编译
2.1 设置config.h
新建$ACE_ROOT/ace/config.h
,文件内容为
#include “ace/config-linux.h”
2.2 设置Platform_macros.GNU
新建$ACE_ROOT/include/makeinclude/platform_macros.GNU
,文件内容为
include $(ACE_ROOT)/include/makeinclude/platform_linux.GNU
2.3 编译
编译顺序为:ACE -> TAO -> DDS
,编译时间长。
- ACE编译
cd $ACE_ROOT
make clean
make
- TAO编译
cd $TAO_ROOT
make clean
make
- DDS编译
cd $DDS_ROOT
./configure
make clean
make
2.4 运行测试脚本
编译完成后,运行测试脚本测试OpenDDS环境是否搭建成功。
到$DDS_ROOT/examples/DCPS/Messenger_Imr
目录,运行run_test.pl
。
cd $DDS_ROOT/example/DCPS/Messenger_Imr
perl ./run_test.pl
结果如下
>>> /home/jamie/DevOpenDDS/ACE_wrappers/TAO/orbsvcs/ImplRepo_Service/tao_imr_locator -o imr.ior -orbendpoint iiop://:20428
>>> /home/jamie/DevOpenDDS/ACE_wrappers/TAO/orbsvcs/ImplRepo_Service/tao_imr_activator -o activator.ior -ORBInitRef ImplRepoService=file://imr.ior -orbendpoint iiop://:15071
>>> /home/jamie/DevOpenDDS/OpenDDS/bin/DCPSInfoRepo -NOBITS -o repo.ior -ORBuseimr 1 -ORBInitRef ImplRepoService=file://imr.ior
>>> /home/jamie/DevOpenDDS/ACE_wrappers/bin/tao_imr -ORBInitRef ImplRepoService=file://imr.ior shutdown InfoRepo
Successfully shut down server <InfoRepo>
>>> /home/jamie/DevOpenDDS/ACE_wrappers/bin/tao_imr -ORBInitRef ImplRepoService=file://imr.ior update InfoRepo -l jamie-vm -c "/home/jamie/DevOpenDDS/OpenDDS/bin/./DCPSInfoRepo -NOBITS -o repo.ior -ORBuseimr 1 -ORBInitRef ImplRepoService=file://imr.ior"
(103868|103868) ImR: Successfully registered <InfoRepo>
>>> /home/jamie/DevOpenDDS/ACE_wrappers/bin/tao_imr -ORBInitRef ImplRepoService=file://imr.ior list -v
Server <InfoRepo>
Activator: jamie-vm
Command Line: /home/jamie/DevOpenDDS/OpenDDS/bin/./DCPSInfoRepo -NOBITS -o repo.ior -ORBuseimr 1 -ORBInitRef ImplRepoService=file://imr.ior
Working Directory:
Activation Mode: NORMAL
Number of retries: 0
Not currently running
/home/jamie/DevOpenDDS/OpenDDS/examples/DCPS/Messenger_Imr/publisher -DCPSConfigFile pub.ini -orbendpoint iiop://:21397
ERROR: Cannot Spawn: <././publisher> not found
/home/jamie/DevOpenDDS/OpenDDS/examples/DCPS/Messenger_Imr/subscriber -DCPSConfigFile sub.ini
ERROR: Cannot Spawn: <././subscriber> not found
>>> /home/jamie/DevOpenDDS/ACE_wrappers/bin/tao_imr -ORBInitRef ImplRepoService=file://imr.ior shutdown InfoRepo
(103858|103858) ImR: shutdown_server () Cannot connect to server <InfoRepo>
Server <InfoRepo> already shut down.
test PASSED.
运行结果显示test PASSED
,测试成功。
三、CentOS8下遇到的一些问题及解决方法
CentOS 8.1 1191下环境搭建与Ubuntu18.04 过程一致,不过环境不同,遇到的问题各有差别,以下记录了自己在CentOS 8.1下遇到的几个问题:
1. make 完ACE和TAO之后,直接make OpenDDS,出现了找不到LibTao_PortableServer这样的错误,估计是TAO编译失败了,就重新更新系统及相关软件。重新编译ACE+TAO,OpenDDS编译通过。
2. 执行时,找不到LibTaoxxxx.so这样的错误,是找不到动态库的路径,可以参考OpenDDS笔记(四) 树莓派下的开发实例 、四、引申、2.2中所述设置so文件夹路径。/etc/ld.so.conf内容如下:
include ld.so.conf.d/*.conf
/home/jamie/DevOpenDDS/OpenDDS/lib
/home/jamie/DevOpenDDS/ACE_wrappers/lib
3. 执行时,提示以下错误,
是perl没有找到$DDS_ROOT/bin/PerlDDS里面的Run_Test.pm模块,只需要在.bashrc或者profile现有的环境变量里,最后加入一行export PERL5LIB=$DDS_ROOT/bin/PerlDDS,告诉perl本地Perl模块的搜索路径就可以。
TAO+DDS Environment
export ACE_ROOT=/home/jamie/DevOpenDDS/ACE_wrappers
export TAO_ROOT=$ACE_ROOT/TAO
export DDS_ROOT=home/jamie/DevOpenDDS/OpenDDS
export PATH=$ACE_ROOT/bin:$DDS_ROOT/bin:$PATH
export LD_LIBRARY_PATH=$ACE_ROOT/lib:$DDS_ROOT/lib:$LD_LIBRARY_PATH
export PERL5LIB=$DDS_ROOT/bin/PerlDDS
4. 出现以下问题,可以把DemoIDL_Export.h和Demo.mwc删掉,重新生成和编写。
5. /Publisher成功启动,./Subscriber发现不了可能是防火墙没关,通过以下命令关闭防火墙即可。
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动