Windows提示和技巧 [待校准@1124]

ROS 2支持Windows 10作为一级平台,这意味着进入ROS 2核心的所有代码必须支持Windows。对于那些习惯于在Linux或其他类似Unix的系统上进行传统开发版本的人来说,在Windows上进行开发可能是一个挑战。本文件旨在列出其中一些差异。 [待校准@1125]

最大路径长度 [待校准@1126]

默认情况下,Windows的 maximum path length 为260个字符。实践调用y而言,其中4个字符始终由驱动器号、冒号、初始反斜杠和最终NULL字符使用。这意味着只有256个字符可用于路径所有部分的 * sum *。这对ROS 2有两个实际影响: [待校准@1127]

  • 一些ROS 2内部路径名相当长。因此,我们始终建议对ROS 2目录的根目录使用短路径名,例如 “c :dev''。 [待校准@1128]

  • 从源文件构建ROS 2时,colcon的默认隔离构建模式可以生成非常长的路径名。为了避免这些非常长的路径名,在Windows上构建时使用 --merge-install[待校准@1129]

注意: 可以将窗口更改为更长的最大路径长度。有关更多信息,请参见 this article[待校准@1130]

导出符号 [待校准@1131]

在Windows上构建库时,默认情况下所有符号都是私有的。这样做的结果是,如果没有特殊处理,另一个库或可执行文件就不能调用库中的任何符号。这种特殊的处理被调用 dllexportdllimport 。的 dllexport 用于库想符号发表调用y调用能够, dllimport 使用图书馆或应用程序想要调用符号。在ROS 2核心代码,包往往标题调用ed visibility_macros.h 有宏定义适当 dllexport / dllimport 报表。有了这些宏,头文件中任何需要公开的符号都需要用宏的 PUBLIC 版本装饰。包的CMakeLists.txt也应具有如下节: [待校准@1132]

target_compile_definitions(${PROJECT_NAME}
  PRIVATE "XXX_BUILDING_LIBRARY")

其中 "XXX" 被替换为宏在 visibility_macros.h 中的名称。 [待校准@1133]

最后,重要的是将导出符号的头文件包含在包中的至少一个 .cpp 文件中,以便宏将被扩展并放入生成的二进制文件中。否则符号仍然无法调用。 [待校准@1134]

调试版本 [待校准@1135]

在Windows上以调试模式构建时,一些非常重要的事情会发生变化。首先,所有的动态链接库都会在库名称后附加 _d 自动调用y。因此,如果库被调用 libfoo.dll ,在调试模式下它将是 libfoo_d.dll 。Windows上的动态链接器也知道寻找那种形式的库,所以它找不到没有 _d 前缀的库。此外,Windows在调试模式下打开一整套编译时和运行时检查,这比发布版本严格得多。由于这些原因,运行Windows调试版本并对许多拉取请求进行测试是一个好主意。 [待校准@1136]

正斜杠与反斜杠 [待校准@1137]

在Windows中,默认路径分隔符是反斜杠 (“”),它不同于Linux和macOS中使用的正斜杠 ( / )。大多数Windows api都可以将其作为路径分隔符来处理,但这并不是普遍正确的。例如,当使用反斜杠字符而不是正斜杠时, cmd.exe 外壳只能完成制表符。为了在Windows上实现最大兼容性,应始终使用反斜杠作为Windows上的路径分隔符。 [待校准@1138]

修补销售包 [待校准@1139]

在ROS 2中销售包时,通常需要应用补丁来修复错误、添加功能等。典型的方法是修改 ExternalProject_add 调用,使用 patch 可执行文件添加 PATCH 命令。不幸的是,chocolatey提供的 patch 可执行文件需要管理员访问权限才能运行。解决方法是在将补丁应用于外部项目时使用 git apply-patch[待校准@1140]

git apply-patch has its own issues in that it only works properly when applied to a git repository. For that reason, external projects should always use the GIT method to obtain the project and then use the PATCH_COMMAND to invoke git apply-patch. [待校准@1141]

以上所有用法的示例如下所示: [待校准@1142]

ExternalProject_Add(mylibrary-${version}
  GIT_REPOSITORY https://github.com/lib/mylibrary.git
  GIT_TAG ${version}
  GIT_CONFIG advice.detachedHead=false
  # Suppress git update due to https://gitlab.kitware.com/cmake/cmake/-/issues/16419
  # See https://github.com/ament/uncrustify_vendor/pull/22 for details
  UPDATE_COMMAND ""
  TIMEOUT 600
  CMAKE_ARGS
    -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_install
    ${extra_cmake_args}
    -Wno-dev
  PATCH_COMMAND
    ${CMAKE_COMMAND} -E chdir <SOURCE_DIR> git apply -p1 --ignore-space-change --whitespace=nowarn ${CMAKE_CURRENT_SOURCE_DIR}/install-patch.diff
)

Windows慢速计时器 (一般慢速) [待校准@1143]

一般来说,在Windows上运行的软件比在Linux上运行的软件慢得多。这是由于一些因素,从默认时间片 (每20 ms,根据 documentation ),数量防病毒和反恶意软件进程运行,到正在运行的后台进程的数量。正因为如此,测试应该永远不要在Windows上期待时间紧迫。所有测试都应该有大量的超时,并且只期望事件最终发生 (这也将防止测试在Linux上变得脆弱)。 [待校准@1144]

贝壳 [待校准@1145]

Windows上有两个主要的命令行外壳: 古老的 cmd.exe 和PowerShell。 [待校准@1146]

cmd.exe is the command shell that most closely emulates the old DOS shell, though with greatly enhanced capabilities. It is completely text based, and only understands DOS/Windows batch files. [待校准@1147]

PowerShell是微软为大多数新应用程序推荐的更新的基于对象的shell。它了解用于配置的 ps1 文件。 [待校准@1148]

ROS 2支持 cmd.exe 和PowerShell,因此任何更改 (尤其是对 amentcolcon 之类的更改) 都应在两者上进行测试。 [待校准@1149]