1

我已经成功地从源代码构建了 OpenDDS 3.13.2。这是我的环境:

  • 视窗 10
  • Visual Studio 2017(重新定位到 SDK 10.0.17763.0 的解决方案)
  • 尝试了所有配置/平台组合

我从 VS 命令提示符成功使用了configure脚本,通过在同一命令提示符下打开生成的解决方案来构建所有内容,最后运行 Messenger 示例(发布者和订阅者),甚至将其配置为成功使用 RTPS。

但是,当我尝试创建自己的 IDL 并使用 tao_idl 时,它会崩溃。这是我的测试(使用来自 setenv.cmd 的适当环境):

> tao_idl(无参数)

IDL: No input files

第二次测试:

> tao_idl Test.idl(崩溃)

我没有收到错误消息,也无法找到日志或任何错误指示。当我使用opendds_idl.

调试此问题的最佳方法是什么,和/或是否有可用于 IDL 编译器(TAO 和 OpenDDS)的预构建二进制文件?

4

1 回答 1

1

经过大约一天的故障排除后,我确定了一个解决方案。尽管可以自己调用 tao_idl 和 opendds_idl,但您基本上不应该这样做。需要大量命令行参数才能使两者都工作,如果它们不存在,每个 exe 都会在没有正确推理的情况下崩溃。

我将在下面添加我的步骤以使用 OpenDDS 创建一个新的基本的两个 exe 发布/订阅项目:

  1. 创建您自己的 IDL 文件。
  2. 从 DCPS Messenger 示例开始,修改 .mpc 文件,替换Messenger.idl为您的 IDL 文件名。
  3. 创建一个名为 的新文件<your project>.mwc,并添加以下内容:

    workspace {
      // the -relative and -include cmdlines make it so this workspace 
      // does not have to be in the $DDS_ROOT directory tree.
    
      // tell MPC to substitute our DDS_ROOT environment variables for relative paths
      cmdline += -relative DDS_ROOT=$DDS_ROOT
    
      // tell the projects where to find the DDS base projects (*.mpb)
      cmdline += -include $DDS_ROOT/MPC/config
    
    }
    
  4. 打开一个新的 VS 命令行终端并运行$DDS_ROOT/setenv.cmd,或者如果您通过 Windows 设置设置了这些环境变量,则打开一个常规终端。

  5. 导航到您的项目目录并调用:mwc.pl -type vs2017,根据构建工具/IDE 的需要替换“vs2017”。

  6. 打开生成的解决方案,并根据您的 Windows SDK 版本重新定位它。

  7. 首先构建<your project>_IDL项目。如果您在输出窗口中注意到,它会自动调用tao_idlandopendds_idl命令。您可以查看.vcxproj文件以查看原始问题的完整命令行参数。

  8. 修改publisher.cppsubscriber.cppDataReaderListenerImpl.cpp文件以匹配您的新 IDL。像往常一样运行示例,然后 ta-da!

为了完整起见,两者的完整命令tao_idlopendds_idl如下:

> opendds_idl -Sa -St "<your file>.idl"

> tao_idl -Wb,pre_include=ace/pre.h -Wb,post_include=ace/post.h -I$(TAO_ROOT) -Sa -St -I$(DDS_ROOT) "<your file>.idl"

> tao_idl -Wb,pre_include=ace/pre.h -Wb,post_include=ace/post.h -I$(TAO_ROOT) -Sa -St -I$(DDS_ROOT) "<your file>TypeSupport.idl"
于 2019-09-26T19:35:16.057 回答