OpenDDS - 解决方案构建良好,示例 运行,但 IDL exes 崩溃
OpenDDS - Solution builds fine, examples run, but IDL exes crash
我已经从源代码成功构建了 OpenDDS 3.13.2。这是我的环境:
- Windows 10
- Visual Studio 2017(重新定位到 SDK 10.0.17763.0 的解决方案)
- 尝试了所有 Configuration/Platform 种组合
我在 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 项目:
- 创建您自己的 IDL 文件。
- 从 DCPS Messenger 示例开始,修改 .mpc 文件,将
Messenger.idl
替换为您的 IDL 文件名。
创建一个名为 <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
}
打开一个新的 VS 命令行终端和 运行 $DDS_ROOT/setenv.cmd
,或者如果您通过 Windows 设置设置了这些环境变量,则打开一个常规终端。
导航到您的项目目录并调用:mwc.pl -type vs2017
,根据您的构建 tool/IDE.
替换 "vs2017" ]
打开生成的解决方案,并根据需要为您的 Windows SDK 版本重新定位。
首先构建 <your project>_IDL
项目。如果您在输出中注意到 window,它会自动调用 tao_idl
和 opendds_idl
命令。您可以查看 .vcxproj
文件以查看作为原始问题的完整命令行参数。
修改 publisher.cpp
、subscriber.cpp
和 DataReaderListenerImpl.cpp
文件以匹配您的新 IDL。 运行 和往常一样的例子和 ta-da!
为了完整起见,tao_idl
和 opendds_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"
我已经从源代码成功构建了 OpenDDS 3.13.2。这是我的环境:
- Windows 10
- Visual Studio 2017(重新定位到 SDK 10.0.17763.0 的解决方案)
- 尝试了所有 Configuration/Platform 种组合
我在 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 项目:
- 创建您自己的 IDL 文件。
- 从 DCPS Messenger 示例开始,修改 .mpc 文件,将
Messenger.idl
替换为您的 IDL 文件名。 创建一个名为
<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 }
打开一个新的 VS 命令行终端和 运行
$DDS_ROOT/setenv.cmd
,或者如果您通过 Windows 设置设置了这些环境变量,则打开一个常规终端。导航到您的项目目录并调用:
mwc.pl -type vs2017
,根据您的构建 tool/IDE. 替换 "vs2017" ]
打开生成的解决方案,并根据需要为您的 Windows SDK 版本重新定位。
首先构建
<your project>_IDL
项目。如果您在输出中注意到 window,它会自动调用tao_idl
和opendds_idl
命令。您可以查看.vcxproj
文件以查看作为原始问题的完整命令行参数。修改
publisher.cpp
、subscriber.cpp
和DataReaderListenerImpl.cpp
文件以匹配您的新 IDL。 运行 和往常一样的例子和 ta-da!
为了完整起见,tao_idl
和 opendds_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"