OpenRTI的编译与ha-hla例程的实现

首先是OpenRTI的编译安装

从GitHub上clone OpenRTI到本地文件夹,项目为了平台通用性,使用cmake来搭建工程,源码cmake之后,打开visual studio进行编译,提示中有两个主要错误:

  1. 一个是提示没有python的debug库文件,python310_d。于是modify一下python安装,安装debug模块,解决一个报错。
  2. 然后报错提示有两个项目的输入文件匹配输出文件,发现是其中的rti1516_py项目和rti1516e_py项目的输出lib的名字与另两个项目rti1516、rti1516e的输出文件名重名,且存在引用关系,导致输入lib和输出lib重名。检查makelist文件,里面的设置中有一个判断,当系统是windows系统时,会对输出文件名更改文件类型避免重名,但是显然没起作用,最后通过更改OpenRTI\python\rti1516和OpenRTI\python\rti1516e两个文件夹中的makelist文件,输出文件名改名,然后重新cmake一下,再编译时报错解除,具体见下方代码。最终完成了项目编译。
# The rti1516 includes
include_directories(${CMAKE_SOURCE_DIR}/include/rti1516)

add_library(rti1516_py MODULE Module.cpp)
set_property(TARGET rti1516_py PROPERTY PREFIX "")
set_property(TARGET rti1516_py PROPERTY OUTPUT_NAME "rti1516test")     #原来是"rti1516",我改成了"rti1516test"
if(WIN32)
  set_property(TARGET rti1516_py PROPERTY SUFFIX ".pyd")
endif()
target_link_libraries(rti1516_py rti1516 fedtime1516 Python::Python)

if(OPENRTI_BUILD_SHARED)
  if(OPENRTI_INSTALL_WITH_RPATH)
    set_property(TARGET rti1516_py PROPERTY INSTALL_RPATH "$ORIGIN/../..")
    set_property(TARGET rti1516_py APPEND PROPERTY LINK_FLAGS "${OPENRTI_RPATH_LINK_FLAGS}")
  endif()
endif()
  
install(TARGETS rti1516_py
  RUNTIME DESTINATION "${INSTALL_PYTHON_DIRECTORY}"
  LIBRARY DESTINATION "${INSTALL_PYTHON_DIRECTORY}"
  ARCHIVE DESTINATION "${INSTALL_PYTHON_DIRECTORY}")

后来与同事沟通,猜测rti1516_py项目和rti1516e_py项目可能时为python接口使用,可以编译时直接先卸载两个项目,以上出现的两个报错都不会再出现。最后也没有影响例程的使用。

ba-hla的安装测试

  1. clone下载ba-hla的源码后,依然需要先cmake一下,由于年代久远,相关makelist的设置已经与openrti不太兼容,主要是一些文件夹地址,需要更改lib引用库的位置设置,不然就会找不到应用的openrti的库。
cmake_minimum_required(VERSION 2.8)
project(ba-hla)

set(cmake_verbose_makefile ON)
set(cmake_c_flags_debug ON)
set(cmake_cxx_flags_debug ON)

## enable debugging
set(cmake_build_type Debug)

include_directories(D:/7_hla_rti/OpenRTI/include/rti1516 )    //改为绝对地址,用来引用openrti的文件
link_directories(D:/7_hla_rti/OpenRTI/build/lib/Release)    //增加了一行link_directories设置,设置lib的引用位置

add_library(ba-hla-lib ExampleFedAmb.cpp ExampleCPPFederate.cpp)
add_executable(ba-hla main.cpp)
target_link_libraries(ba-hla ba-hla-lib rti1516 fedtime1516)

install(TARGETS ba-hla DESTINATION bin)
  1. 然后在vs中编译成功了,在release文件夹出现两个文件,其中一个是ba-hla.exe可执行文件,另一个是ba-hla-lib.lib。
  2. 要将\ba-hla\source文件夹中的testfom.fed、testfom.xml、fdd.xml文件复制到release文件夹中。
  3. 最后需要将openrti编译生成的dll文件全部拷进来,就是OpenRTI\build\bin\Release文件夹里的全部dll文件,拷入\OpenRTI\ba-hla\build\Release中。
    完成ba-hla编译配置。

例程测试

  1. 运行openRTI在rtinode模式,在命令行中执行./rtinode -i 127.0.0.1,此时执行运行了rtinode.exe命令行处于等待状态。光标在下一空行前闪烁等待。
    运行OpenRTI
  2. 运行ha-hla,另启动一个命令行程序,执行ba-hla --name myFederate --address 127.0.0.1 --fom testFom.xml,成功后,会有成功创建联邦并加入的提示。
    运行ba-hla
  3. OpenRTI的ritnode是监测本机的14321端口,如果不成功,可以用telnet命令查看14321端口是否通,若不通,通过网络设置开通。

补充:后来发现上述的情况还是未成功执行状态,程序在getInteractionClassHandle()处出bug闪退了。通过增加try-throw-catch方法,定位了bug种类,最后发现是FOM的xml文件testfom.xml有错误,interactionClass定义不全,只给了root class没给子class X和parameter xa和xb,所以会闪退。在testfom.xml中按照标准格式添加子interactionClass X及其parameter xa和xb,具体修改见下图。
testfom.xml文件.png

重新编译之后,再执行就可以得到真正正确的运行结果了,见下图


ha-hla最终运行效果

你可能感兴趣的:(OpenRTI的编译与ha-hla例程的实现)