Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)

  • Post author:
  • Post category:其他


本文默认以二进制方式安装好了 Fast DDS(安装包可以从官网获取,建议使用下载工具提速)。运行环境是Windows。

本文介绍了两种方法,一种是直接编译运行,另一种是从.idl文件编译运行。

准备工具

Visual Studio

方法一:直接编译运行

我为了防止权限问题,是在D盘里进行操作的。

我们进入路径\examples\C++,就可以愉快地看见很多示例项目,如下图:

我们点进去一个项目,我选择的是HelloWorldExample。 打开Readme.txt,它会提示你在命令行里运行HelloWorldExample.exe。

但是很显然,文件夹里只有HelloWorldExample.cxx等源文件,

并没有

HelloWorldExample.exe这个可执行文件。

这时候应该怎么办呢?当然是想办法

编译

了。

在命令行里直接编译容易出现找不到依赖项的问题,所以我推荐使用Visual Studio编译,更好地管理依赖包。

我们先来build一下。

以管理员身份运行PowerShell,输入以下代码:

mkdir build
cd build
cmake ..

//cmake ..可以换成下面这句,这是官网的推荐
cmake -Bbuildexample -DFASTDDS_STATIC=ON .

可以看到这时候目录下多出了

buildexample

文件夹,在buildexample文件夹里面可以找到.sln文件。

用Visual Studio打开.sln文件,可以在左边栏看见四个项目。

在菜单栏点击

生成->全部生成

可能会出现报错:

2>LINK : fatal error LNK1104: 无法打开文件“eProsima_p11.lib”

我经过寻找,发现整个电脑里并没有eProsima_p11.lib这个包。所以按照下面的流程操作即可。(从该博客魔改而来:

LINK : fatal error LNK1104: 无法打开文件“XXXXX.lib”解决方法_King’sEngine的博客-CSDN博客_lnk1104无法打开文件lib

右键HelloWorldExample项目:

依次点击:属性、链接器、输入

依次点击:图中展开箭头、编辑

在下图框出的地方寻找eProsima_p11.lib,找到了就直接删掉(在包名上双击、Delete)。

这样生成的时候,Visual Studio就不会去管那个不存在的eProsima_p11.lib包了。(什么叫暴力美学啊)

再次点击

生成->全部生成

生成结果:

红线部分给出的是编译得到的.exe文件的路径。至此编译完成,下一步是运行。

回到文件夹界面,进入路径

.\Debug。

我们可以看到,心心念念的

HelloWorldExample.exe

已经生成了。根据Readme的内容:

In the first one launch: ./HelloWorldExample publisher (or

HelloWorldExample.exe publisher on windows

).

In the second one: ./HelloWorldExample subscriber (or

HelloWorldExample.exe subscriber on windows

).

意思是,在两个命令行窗口中分别输入:


.\HelloWorldExample.exe publisher


.\HelloWorldExample.exe subscriber

就可以运行示例程序了。

所以我们在这个文件夹下,以管理员身份,分别打开两个PowerShell窗口,分别输入:

# 窗口1
.\HelloWorldExample.exe publisher

# 窗口2
.\HelloWorldExample.exe subscriber

可能会出现警报,直接点“允许访问”。

运行效果如下,运行示例成功生成。

方法二:从.idl文件编译运行


eProsima Fast DDS-Gen

是一个 Java 应用程序,它使用接口描述语言 (IDL) 文件中定义的数据类型生成源代码。此应用程序可以执行两种不同的操作:

  1. 为自定义Topic生成C++定义。

  2. 生成使用Topic数据的功能示例。

本文介绍的是第二条,而第一条可以参照官方文档(

进入链接

) 。

同样的,我为了防止权限问题,在D盘里进行操作。

我们不妨把上文的HelloWorldExample文件夹的HelloWorld.idl单独复制出来,放到一个新的文件夹里。

其实我们可以打开.idl文件,看看里面写了什么。它的内容很简单,只有短短数行代码:

struct HelloWorld
{
	unsigned long index;
	string message;
};

它描述了一个Topic的内容,而刚刚提到的

Fast DDS-Gen

工具可以将.idl文件生成为项目的源代码,这是一个十分优雅的设计。

在该文件夹下,以管理员身份运行PowerShell,输入:

fastddsgen.bat -example CMake .\HelloWorld.idl

回到文件夹,我们发现一下子多出了很多文件。

用Visual Studio打开该文件夹。这次

不用build

就可以生成了。等待一段时间,Visual Studio会自动执行Cmake操作。

等到页面下方能够看到“Cmake生成完毕”字样(如上图)。接下来的内容就和上一章很像了:在菜单栏点击

生成->全部生成

生成结果:

回到文件夹界面,进入路径

.\out\build\x64-Debug (默认值),在该路径下能够找到HelloWorld.exe。

在这个文件夹下,以管理员身份,分别打开两个PowerShell窗口,分别输入:

# 窗口1
.\HelloWorld.exe publisher

# 窗口2
.\HelloWorld.exe subscriber

可能会出现警报,直接点“允许访问”。

运行效果如下,运行示例

成功运行

细心的话会发现两种方式的运行结果并不一样,原因会在接下来讲到。

结语

细心的小伙伴会发现,与官方给出的HelloWorldExample文件夹相比,直接从.idl生成的文件里少了

HelloWorldPublisher.cpp、HelloWorldSubscriber.cpp

两个文件。运行结果也有不同,官方文件能够做到自动收发消息、限制消息条数,而我们自己从.idl文件生成的程序无法做到。

这是因为以.idl文件生成源代码的方式,能够使项目以默认模式跑起来,与.idl文件本身的内容无关,下一步应该是在.idl生成的.h、.cxx文件里

添加

代码以实现功能,也可以新建.cpp文件进行编程。而官方的Examples已经在.h、.cxx、.cpp文件里写好了完备的代码。关于如何编程,可以查看官方教程:

1.3. Writing a simple C++ publisher and subscriber application — Fast DDS 2.6.0 documentation

另外,了解.idl的数据结构,也有助于Topic的设计。官方教程:


5. Defining a data type via IDL — Fast DDS 2.6.0 documentation (eprosima.com)



版权声明:本文为Eliza_Her原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。