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

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

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

准备工具

Visual Studio

方法一:直接编译运行

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

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

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第1张图片

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

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第2张图片

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第3张图片

但是很显然,文件夹里只有HelloWorldExample.cxx等源文件,并没有HelloWorldExample.exe这个可执行文件。

这时候应该怎么办呢?当然是想办法编译了。

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

我们先来build一下。

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

mkdir build
cd build
cmake ..

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

 可以看到这时候目录下多出了buildexample文件夹,在buildexample文件夹里面可以找到.sln文件。

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第4张图片

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

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第5张图片

在菜单栏点击生成->全部生成。 

可能会出现报错:

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

我经过寻找,发现整个电脑里并没有eProsima_p11.lib这个包。所以按照下面的流程操作即可。(从该博客魔改而来:LINK : fatal error LNK1104: 无法打开文件“XXXXX.lib”解决方法_King'sEngine的博客-CSDN博客_lnk1104无法打开文件lib)

右键HelloWorldExample项目:

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第6张图片

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

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第7张图片

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

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第8张图片

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

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第9张图片

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

再次点击生成->全部生成

生成结果:

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第10张图片

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

回到文件夹界面,进入路径.\Debug。

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第11张图片

我们可以看到,心心念念的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

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

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第12张图片

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

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第13张图片

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

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

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

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

本文介绍的是第二条,而第一条可以参照官方文档(进入链接) 。

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

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

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第14张图片

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

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

它描述了一个Topic的内容,而刚刚提到的Fast DDS-Gen工具可以将.idl文件生成为项目的源代码,这是一个十分优雅的设计。

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

fastddsgen.bat -example CMake .\HelloWorld.idl

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第15张图片

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

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第16张图片

 用Visual Studio打开该文件夹。这次不用build就可以生成了。等待一段时间,Visual Studio会自动执行Cmake操作。

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第17张图片

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

生成结果:

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第18张图片

回到文件夹界面,进入路径.\out\build\x64-Debug (默认值),在该路径下能够找到HelloWorld.exe。

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第19张图片

  

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

# 窗口1
.\HelloWorld.exe publisher

# 窗口2
.\HelloWorld.exe subscriber

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

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第20张图片

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

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

Windows下运行Fast DDS示例程序(包含.idl文件的使用方法)_第21张图片

结语

细心的小伙伴会发现,与官方给出的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)

你可能感兴趣的:(windows,visual,studio,c++)