Webots:RHex仿真平台搭建——(三)使用VS编译器+QT库作为控制器开发环境

虽然Webots自带了一个很简单的Text Editor可以用来编写简单的控制程序,但是考虑到整个机器人的控制系统较为复杂,并有可能需要用到多线程对多个腿进行处理,所以决定采用VS对控制器进行开发,除此之外因为用习惯了QT库,所以决定将QT库也配置在工程中一并使用。

1. 配置环境

1)Visual Studio 2019
2)Qt 5.10.1 MSVC2015

2. 创建VS工程

在Webots中点击 向导 -> 新机器人控制器 -> C++ -> Microsoft Visual Studio ->
输入控制器名称 -> 完成

即可创建一个VS中的控制器工程
在这里插入图片描述
导入的工程较为凌乱,将其整理一下
在这里插入图片描述

3. 配置QT库

1)项目属性 -> C/C++ -> 常规
在附加包含目录中添加
D:\Qt\Qt5.10.1\5.10.1\msvc2015_64\include
D:\Qt\Qt5.10.1\5.10.1\msvc2015_64\include\QtCore
路径根据自己QT库的安装路径修改
需要用到QT其他库可自行添加
在这里插入图片描述
2)项目属性 -> C/C++ -> 预处理器
预处理器定义中添加
QT_CORE_LIB
在这里插入图片描述
3)项目属性 -> 链接器 -> 常规
附加库目录中添加
D:\Qt\Qt5.10.1\5.10.1\msvc2015_64\lib
路径根据自身QT库安装路径修改
在这里插入图片描述
4)项目属性 -> 链接器 -> 输入
附加依赖项中添加
Qt5Core.lib
Qt5Cored.lib
qtmain.lib

在这里插入图片描述
确定并应用
在代码中添加Qt库的调用进行测试
在这里插入图片描述
显示如下错误
在这里插入图片描述
重启VS即可

3. 创建继承Q_OBJECT的子类

如图,构建继承Q_OBJECT的子类user
在这里插入图片描述
编译运行出现以下错误

1>user.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __cdecl user::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@user@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)
1>user.obj : error LNK2001: 无法解析的外部符号 "public: virtual void * __cdecl user::qt_metacast(char const *)" (?qt_metacast@user@@UEAAPEAXPEBD@Z)
1>user.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl user::metaObject(void)const " (?metaObject@user@@UEBAPEBUQMetaObject@@XZ)

原因是Q_OBJECT中所包含的QT的槽机制需要用特定的moc中间编译工具进行编译,因为VS本身并不带有这种功能,因此会出现上述错误
解决方法
右键继承了Q_OBJECT的头文件 -> 属性 ->项类型 改为 自定义生成工具 点击应用
在这里插入图片描述
点击应用后在左侧菜单栏弹出自定义生成工具,选中 在右侧添加
命令行: moc.exe user.h -o moc_user.cpp
输出: moc_user.cpp
附加依赖项:moc.exe user.h

注意上述命令中的头文件名要与你需要编译的引用了Q_OBJECT对象的头文件名保持一致
在这里插入图片描述
**点击应用->确定
右键user.h ->编译 ** 此时已经在工作目录生成了moc_user.cpp文件,右键项目->添加现有项
在这里插入图片描述
在这里插入图片描述
编译运行整个项目,编译通过,至此基于QT库的项目环境已经构建完成。