本文默认以二进制方式安装好了 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) 文件中定义的数据类型生成源代码。此应用程序可以执行两种不同的操作:
-
为自定义Topic生成C++定义。
-
生成使用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)