今天遇到Windows 10里安装的Ubuntu(WSL)的缺点

文章讲述了开发者在Windows10的WSL中使用Ubuntu遇到的宽字符串转换问题,指出WSL在某些特定操作(如宽字符串处理)上存在局限,建议在遇到难题时考虑切换到其他Linux环境,如Termux。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随着技术的发展,越来越多开发者转向使用 Windows Subsystem for Linux(WSL)在 Windows 10 上进行开发,也就是说不用虚拟机,不用准备多一台电脑,只需要在Windows 10/11 里安装 WSL 就能体验 Linux 系统。因此我在 Win10 系统里安装了Ubuntu 20 系统学习 Linux 基础,可以用来编译 C / C++ 代码,体验同一个代码编译运行与 Windows 环境下的差别。

之前就听说 WSL 有一些潜在的限制,无论性能还是功能都不能完全取代裸机 Linux 系统。今天就被我逮到 WSL 下的 Ubuntu 的一个缺点:输出宽字符串(wide string)时失败。

比如下面一段把普通字符串转换成宽字符串的 C 代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include <locale.h>
    
int main() {
	// Windows环境下要设为 setlocale(LC_ALL, "en-US.UTF-8");
	// Linux环境下设为 setlocale(LC_ALL, "");
	// 设置不当的话,转换后的宽字符串长度不正确
    setlocale(LC_ALL, "");

    char* str = "22年2月22日";
    int len = strlen(str);
    printf("narrow string: %s\n", str);
    printf("narrow string length: %d\n", len);

    wchar_t* wstr = (wchar_t*)malloc((len + 1) * sizeof(wchar_t));
    size_t wlen = mbstowcs(wstr, str, len+1);

    wprintf(L"wide string: %ls\n", wstr);
    printf("wide string length: %zu\n", wlen);
    for(size_t i=0; i<wlen; i++)
        wprintf(L"%lc\t%d\n", wstr[i], (int)wstr[i]);

    free(wstr);
    return 0;
}

这段代码演示了普通字符串“22年2月22日”默认状态下的长度是14字节,但这个长度是机内码的长度,而人类理解的长度应该是8才对,在Python和Java里也得出8,为了使 C 代码获得与Python、Java代码计算一样的长度,必须把它转换成宽字符串格式。代码接下来输出各个字符值。在 Windows 环境下,必须在主程序里设置本地代码页环境setlocale(LC_ALL, "en-US.UTF-8");或者setlocale(LC_ALL, "zh-CN.UTF-8");,使用 clang 编译运行的结果才能正常输出宽字符串长度为8:
在这里插入图片描述
到了 WSL 的 Ubuntu 环境,由于Ubuntu终端的字符编码默认是UTF-8,因此主程序中要把 LC_ALL后面的字符串置空:setlocale(LC_ALL, "");,否则计算出来的宽字符串长度也不正确。然后编译运行:

在这里插入图片描述
经过设置setlocale(LC_ALL, "");以及mbstowcs转换后的宽字符串长度是8,正确。但是接下来的 wprintf 语句无法输出转换后的字符串以及每个字符对应的值。我尝试了各种办法修改 wprintf 、 printf 、setlocale 语句,但输出结果无济于事,令人百思不得其解。

直到后来我在安卓手机上安装了Termux(一款运行于安卓系统的 Linux 模拟器),然后在手机上运行 clang 编译再运行 ~~ 在手机里运行结果却正常了。

在这里插入图片描述

换了环境,豁然开朗!

由此可见 Windows 10 的 WSL(Ubuntu) 在处理特定操作时确实有其局限性。在遇到令人摸不着头脑的问题时不妨切换到其它 Linux 环境再试试。

<think>嗯,用户这次的问题是询问如何在Windows10安装CVAT。首先需要回顾之前的对话,确保遵守那些系统级指令,比如行内公式用$...$,独立公式用$$...$$。用户提到了参考站内引用,但之前的内容并没有具体提到CVAT,所以可能需要从零开始指导用户安装。用户的需求很明确,就是安装和配置CVAT。Windows环境下安装CVAT可能会有不少挑战,尤其是依赖项的问题。根据官方文档,CVAT主要依赖Docker,所以需要先确保用户的Windows系统支持Docker。需要检查Windows版本是否满足要求,比如必须是Pro或Enterprise版本,家庭版可能需要升级。接下来考虑步骤分解。第一步应该是安装WSL和DockerDesktop,这是基础环境。用户可能不太熟悉Linux子系统,需要详细说明如何启用WSL功能并安装Ubuntu。然后DockerDesktop的安装步骤也要具体,比如下载链接和配置选项。然后处理CVAT的源码获取。这需要提醒用户正确的目录位置,避免权限问题。之后是配置文件修改,比如设置CVAT_HOST的环境变量,用户可能容易忽略这一步,导致后续无法访问Web界面。添加Nessdii/docker-images这个步骤是为了支持AutoSegmentation,如果用户不需要的话可能可以跳过,但为了功能完整还是建议加上。在执行DockerCompose之前,检查端口占用情况很重要,避免端口冲突。启动容器后,如果用户遇到访问问题,需要提示常见排查点,比如防火墙设置或者Docker是否运行正常。最后用户管理部分,创建超级账户是必要的,但普通用户可能不需要,这可以留作可选步骤。可能用户遇到的常见问题包括Docker启动失败,通常是因为WSL没有正确启用,或者系统未更新。需要强调以管理员身份运行命令的必要性,比如在PowerShell中启用WSL功能。此外,用户可能在初始化时忘记执行docker-composeup-d命令,导致无法访问,所以步骤中要明确每个命令的顺序。考虑到用户的技术水平,是否需要分步截图?但按照文本指导的话,清晰的命令和注意事项可能更有效。另外,性能要求方面,CVAT需要至少4GB内存和双核CPU,这点需要提醒,避免用户设备配置不足导致运行卡顿。最后的安全问题,修改默认端口(比如从8080改为80)可能涉及权限问题,建议保持默认。用户可能想了解后续的标注操作,所以在相关问题可以加入数据导入、标注教程等,帮助用户进一步使用。可能还要提到备份数据,避免容器重建导致的数据丢失,但安装指南可以暂不涉及。整个过程需要确保命令准确,特别是涉及路径的部分,比如设置COMPOSE_PROJECT_NAME可能导致后续脚本无法执行,因此不建议用户修改。环境变量设置部分,正确的主机地址是关键,否则Web界面无法访问,要强调localhost或127.0.0.1的正确使用。总结下来,步骤要简明,避免遗漏关键点,同时预判用户可能遇到的问题,在注意事项提前说明。确保所有命令在管理员权限下执行,正确安装依赖,最后验证容器状态和Web访问,完成安装。</think> 好的,在 Windows 10安装和配置 CVAT (Computer Vision Annotation Tool) 需要依赖 Windows Subsystem for Linux (WSL) 和 Docker,因为 CVAT 主要运行在 Linux 容器环境中。以下是详细的安装步骤: **核心前提条件** 1. **Windows 版本:** 需要 Windows 10 **版本 2004 (Build 19041) 或更高版本** (专业版、企业版或教育版)。家庭版需要满足此版本要求。 2. **启用虚拟化:** 确保你的计算机 BIOS/UEFI 设置中启用了 CPU 虚拟化(如 Intel VT-x / AMD-V)。 3. **足够的资源:** CVAT 组件较多,建议至少有 **8GB RAM** 和足够的磁盘空间(20GB 以上可用)。 **安装步骤** 1. **启用 Windows Subsystem for Linux (WSL 2):** * 以管理员身份打开 **PowerShell**。 * 运行命令启用 WSL: ```powershell dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart ``` * 运行命令启用虚拟机平台功能: ```powershell dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart ``` * **重启计算机**。 * 以管理员身份再次打开 PowerShell。 * 设置 WSL 2 为默认版本: ```powershell wsl --set-default-version 2 ``` 2. **安装 Linux 发行版 (推荐 Ubuntu):** * 打开 **Microsoft Store**。 * 搜索并安装一个 WSL 2 兼容的 Linux 发行版,如 **Ubuntu 20.04 LTS** 或 **Ubuntu 22.04 LTS**。 * 安装完成后,从开始菜单启动 Ubuntu。系统会要求你创建用户名和密码(这个用户是 *Linux* 子系统的用户,可以与 Windows 用户不同)。建议用户名**不要包含大写字母或空格**。 3. **安装 Docker Desktop for Windows:** * 前往 Docker 官网: `https://www.docker.com/products/docker-desktop` * 下载并安装 **Docker Desktop for Windows**。 * 安装完成后启动 Docker Desktop。 * 进入 Docker Desktop 的 **Settings -> General**: * 确保勾选 `Use the WSL 2 based engine`。 * 进入 **Settings -> Resources -> WSL Integration**: * 勾选 `Enable integration with my default WSL distro`(确保选中了你刚刚安装Ubuntu 发行版)。 * 建议也勾选 `Enable integration with additional distros`(如果你安装了其他 WSL Linux 发行版,同样勾选它们)。 * 点击 **Apply & Restart**。 Docker 现在将在 WSL 2 环境中运行。 4. **获取 CVAT 源代码 (WSL Ubuntu 终端):** * 在开始菜单中找到并打开你的 **Ubuntu** 终端(WSL)。 * 创建一个合适的工作目录,例如: ```bash mkdir ~/cvat cd ~/cvat ``` * 使用 `git` 克隆官方 CVAT 仓库(确保已安装 `git`,若没有,运行 `sudo apt update && sudo apt install git`): ```bash git clone https://github.com/opencv/cvat cd cvat ``` 5. **配置并启动 CVAT (WSL Ubuntu 终端):** * 创建必要的环境变量配置文件: ```bash cat <<EOF > docker-compose.override.yml version: '3.8' services: cvat: environment: CVAT_HOST: "127.0.0.1" EOF ``` 这个文件设置了一个环境变量 `CVAT_HOST`,告诉 CVAT Web UI 服务可以通过 `127.0.0.1` (localhost) 访问。 * (可选但推荐) 为了支持自动分割功能,需要添加一个第三方镜像仓库: ```bash echo "COMPOSE_PROJECT_NAME=cvat" >> docker-compose.override.yml echo "COMPOSE_DOCKER_CLI_BUILD=1" >> docker-compose.override.yml docker-compose -f docker-compose.yml -f docker-compose.dev.yml -f docker-compose.override.yml build # 构建镜像 ``` * 启动 CVAT 容器: ```bash docker-compose -f docker-compose.yml -f docker-compose.dev.yml -f docker-compose.override.yml up -d ``` 这个命令会拉取基础镜像并启动所有必要的容器(PostgreSQL, Redis, CVAT UI, CVAT Server, Traefik 等)。首次启动可能需要几分钟。如果出现错误,仔细查看提示信息,可能涉及权限问题或端口占用。确保 `8080` 端口没有被其他程序占用。 6. **验证安装:** * 容器启动完成后,等待一两分钟让服务完全初始化。 * 打开你的 **Windows 默认浏览器**。 * 访问地址: `http://localhost:8080` * 如果一切顺利,你应该能看到 CVAT 的登录界面。 7. **创建用户 (WSL Ubuntu 终端):** * 初次使用需要创建一个超级用户(管理员)账户: ```bash docker exec -it cvat_server bash -ic 'python3 ~/manage.py createsuperuser' ``` * 按提示输入用户名、邮箱地址(可选但推荐)和密码。 * 现在你可以在浏览器 `http://localhost:8080` 使用刚刚创建的用户名和密码登录 CVAT。 **重要配置注意事项** * **性能:** CVAT 在资源受限的机器上可能运行缓慢。确保分配足够的 RAM(Docker Desktop 设置 -> Resources -> Memory)给 Docker 引擎(建议至少 4GB)。WSL 本身也可以在设置文件中(`C:\Users\<你的用户名>\.wslconfig`)配置内存限制。 * **端口冲突:** 确保 Windows 上没有其他应用程序正在使用端口 `8080`。如果冲突,可以在 `docker-compose.override.yml` 的 `cvat` 服务的 `ports` 部分修改端口映射(例如 `- "8090:8080"`),然后在浏览器访问 `http://localhost:8090`。 * **WSL 与 Docker Desktop 通信:** `docker-compose` 命令必须在你的 WSL Ubuntu 终端中运行,以利用 WSL 2 集成。不要在 Windows 的命令提示符 (CMD) 或 PowerShell 中运行这些命令。 * **存储位置:** CVAT 存储上传的数据集、标注和模型的文件位于 WSL 2 发行版的文件系统中。这些数据会保存在 WSL 虚拟机中,即使关闭容器或 Docker Desktop 也不会丢失(除非你重置或删除 WSL 发行版)。备份时要注意备份整个 WSL 文件系统。 * **更新 CVAT:** 进入 `~/cvat/cvat` 目录,运行 `git pull` 获取最新代码,然后重新运行构建和启动命令(`docker-compose ... build` 和 `docker-compose ... up -d`)。 **登录和开始使用** 访问 `http://localhost:8080`,使用你在第 7 步创建的超级用户凭据登录。登录后,你可以开始创建任务、上传数据、进行标注、创建和管理项目、使用自动标注功能等。官方文档(`https://opencv.github.io/cvat/`)是学习如何使用 CVAT 的宝贵资源。 **相关问题** 1. CVAT 在 Windows安装需要满足哪些最低系统要求?[^winreqs] 2. 安装 Docker Desktop 后启用 WSL 2 集成的具体步骤是什么? 3. 如果无法通过 `http://localhost:8080` 访问 CVAT,应该检查哪些地方?[^troubleshoot] 4. 如何备份和恢复在 Windows WSL 2 中运行的 CVAT 的所有数据(任务、数据集、标注)?[^backup] 5. 如何在 CVAT 中配置和使用自动化标注工具(如 Intel's TensorFlow OD API 或 Nuclio)? 6. 与在原生 Linux 机器上安装相比,在 Windows 10 上通过 WSL 2 和 Docker 安装 CVAT 有哪些主要的优缺点?[^wslvslinux] [^winreqs]: 参考微软官方 WSL 2 文档和 Docker Desktop for Windows 系统要求。 [^troubleshoot]: 常见的排查点包括 WSL 状态 (`wsl -l -v`), Docker Desktop 状态, 容器状态 (`docker ps -a`), 端口占用 (`netstat -ano | findstr :8080`), 防火墙设置等。 [^backup]: WSL 2 数据存储于虚拟硬盘文件中 (`%USERPROFILE%\AppData\Local\Packages\<DistroPackage>\LocalState\ext4.vhdx`), 但直接备份此文件操作复杂,推荐使用导出 (`wsl --export <distro> <filename.tar>`) 或容器内数据卷备份。 [^wslvslinux]: WSL 2 安装便捷性提升,避免了双系统或虚拟机安装;但 I/O 性能可能略低于原生 Linux,资源管理更复杂,与 Linux 系统管理交互有额外层。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值