Windows中使用wsl之后文件名大小写不敏感导致的问题

Windows中使用wsl之后文件名大小写不敏感导致的问题

现象

最近使用WSL中的CentOS作为c++的编译和开发环境,有个地方一直编译失败,报如下错误:

make[2]: *** No rule to make target `src/CMakeFiles/Xyz.dir/depend'.  Stop.

原因

因为项目直接放在本地d盘,所以,在CentOS里面的路径就是用的/mnt/d,其他和在Windows里面使用没有区别,从这个报错信息来看,就是说 src/CMakeFiles/Xyz.dir/depend.cmake 文件找不到,但vim去编辑是可以打开的。为什么会这样呢?
原来是在CMakeLists.txt文件中定义了同名的可执行文件和库文件,只是有大小写的区别,这个在linux下面是很常见,是正常的,因为文件系统是Windows mount到linux系统的,所以,文件名就变得不敏感了,后面的library的名字把前面的executable的文件夹覆写掉了。

add_executable(Xyz)
...
add_library(xyz)

Linux系统里面应该会同时存在Xyz.dir和xyz.dir两个文件夹的,但在Windows系统里面只有xyz.dir文件夹了,所以,导致上面Xyz.dir的文件找不到的错误。

解决方案

  1. 把这两个目标文件的名字改成不一样的,但这个终究是个坑。另外,如果是其他的项目,还要改关联的项目,保不齐还有问题。
  2. 将Windows设置成支持文件名敏感(推荐)

在 Windows 10 中开启文件名大小写敏感的功能,需要注意这个功能必须启用 WSL 才可使用,启用的方法是在控制面板中搜索功能,点击如下:

勾选这一项:

然后,使用管理员权限 cmd 或者 powershell 中运行:

\> fsutil file setCaseSensitiveInfo d:\test enable
已启用目录 d:\test 的区分大小写属性。

只要针对这个路径进行设置,但这个命令没有recursive的功能,子目录就没有继承的能力,所以,如果需要对子目录进行递归处理,需要使用PowerShell的脚本,运行pwsh可以启动PowerShell的console:

\> cd d:\test && (Get-ChildItem -Recurse -Directory).FullName | ForEach-Object {fsutil.exe file setCaseSensitiveInfo $_ enable}

这样,目录下面的每个子目录都递归的设置好了,后面如果是新增的文件夹,默认就会添加这个属性了,所以,只需要递归执行一次。

  1. 将项目文件夹移到linux的目录里面去,这样就是linux的本地文件了,自然就没有大小写的问题了,简单实用,并且性能也更好。只是如果有经常制作新的linux,发行给其他人使用的工作,这样就需要经常切换linux,需要把其中的文件夹拷贝到其他的linux里面。如果没有制作和切换linux的需求,这种方式是最推荐的。
posted @ 2023-02-25 23:09  yangwen0228  阅读(325)  评论(0编辑  收藏  举报