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上构建库时,默认情况下所有符号都是私有的。这样做的结果是,如果没有特殊处理,另一个库或可执行文件就不能调用库中的任何符号。这种特殊的处理被调用 dllexport 和 dllimport 。的 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,因此任何更改 (尤其是对 ament
或 colcon
之类的更改) 都应在两者上进行测试。 [待校准@1149]