将RQt插件移植到Windows

Windows 10 的注意事项

TinyXML 版本 1 的问题

我无法成功使用 TinyXML。在必要时我升级到 TinyXML-2。这是一个相当简单的变更。

查看 此 PR 以获取将代码迁移到 TinyXML-2 的示例。

使用``__cplusplus``的代码和需要pluginlib的代码

在某些地方,尤其是在pluginlib的ROS 2端口中,使用了``__cplusplus``标志。不幸的是,在Windows Visual Studio上,无论实际使用的C++标准是什么,都无法正确设置该标志。有关更多信息,请参阅`此页面<https://docs.microsoft.com/en-us/cpp/build/reference/zc-cplusplus?view=vs-2017>`__。

要设置它,您需要添加编译选项``/Zc:__cplusplus``。

例如,在CMake中,您可以这样做:

target_compile_options(${PROJECT_NAME} PUBLIC "/Zc:__cplusplus")

构建产物的位置(安装前)

这个问题只在构建 qt_gui_cpp 时出现。在这个软件包中,自定义命令依赖于软件包的另一个部分中的目标库。然而,在构建完成之前,该库不会被安装。Windows 构建位于 ${configuration} 目录中。例如:

在 Linux 上,qt_gui_cpp.a 将会构建在:<ros2_ws>/build/qt_gui_cpp/src/qt_gui_cpp/

但是在 Windows 上,qt_gui_cpp.lib 将会构建在:<ros2_ws>/build/qt_gui_cpp/src/qt_gui_cpp/Release

为了在这种情况下实现跨平台兼容性,请使用 CMake 生成器表达式。然而,在需要链接库时,请确保使用 $<TARGET_LINKER_FILE:_target> 而不是 $<TARGET_FILE:_target>。后者会找到 .dll 文件,在Windows上无法链接。参见 此处的示例

编译器和链接器标志

通常在移植到Windows时,许多软件包可能会使用额外的编译器标志。您可以在 Microsoft 的文档 中找到Windows编译器标志。C++编译器称为 cl.exe

有关链接器标志,请参阅 Microsoft 的文档。链接器程序称为 link.exe

然而,CMake实际上在变量中提供了许多这些选项。这个`StackOverflow页面<https://stackoverflow.com/questions/9298278/cmake-print-out-all-accessible-variables-in-a-script>`__提供了一个很好的示例,可以查看脚本中所有可用的CMake变量。