OpenDDS - 解决方案构建良好,示例 运行,但 IDL exes 崩溃

OpenDDS - Solution builds fine, examples run, but IDL exes crash

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

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

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

> tao_idl(无参数)

IDL: No input files

第二次测试:

> tao_idl Test.idl(崩溃)

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

时也会发生同样的事情

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

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

我将在下面添加我的步骤,以使用 OpenDDS 创建一个新的基本双 exe pub/sub 项目:

  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,根据您的构建 tool/IDE.

  6. 替换 "vs2017" ]
  7. 打开生成的解决方案,并根据需要为您的 Windows SDK 版本重新定位。

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

  9. 修改 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"