Cmake构建时错误Assertion failed: hunk, file ../patch-2.5.9-src/patch.c, line 354,最简单解决办法

最近有项目用到了eigen,eigen是一个C++模板库,主要特色就是支持线性代数的计算。

但在安装eigen时,使用Cmake构建编译过程中,碰到了一个头疼的问题,每次都会报错

Assertion failed: hunk, file ../patch-2.5.9-src/patch.c, line 354

完整的报错信息如下:

遇到的这个问题,纠结了很长一段时间,原本以为是第三方库patch出了问题,但始终也没找到patch.c文件在哪里。

最后终于找到了问题根源,就是因为文件中的换行字符在Linux和Windows表现不同导致

由于依赖项的patch、diff文件中,存在行尾换行字符不一致,所以导致了Assertion failed: hunk, file ../patch-2.5.9-src/patch.c, line 354错误的出现。

核心原因

在各个系统中,编辑文件生成的换行符,其实是不一样的:

Unix/Linux 系统中:每行结尾只有 "<换行>",即 "\n";

Windows/Dos 系统中:每行结尾是 "<回车><换行>",即 "\r\n";

Mac 系统中:每行结尾是 "<回车>",即 "\r"。

这个时候,如果我们使用的是跨平台的开源库,就很容易碰到这样的问题,因为保不齐某些构建、编译文件就是在Linux下编写的,而我们如果在Windows平台上构建编译,就会无法识别或者报错。

不同系统所定义的换行格式不同,导致的直接后果是,Unix/Mac 系统下的文件在 Windows 里打开的话,所有文字会变成一行;而 Windows 里的文件在 Unix/Linux 下打开的话,在每行的结尾会多车一个 ^M 字符。

Dos 和 windows 采用 "回车+换行",即 "CR + LF" 表示下一行,即敲一下回车键,相当于同时执行了 "回车+换行",即 ^M$($ 不是换行符的表示,换行符没有表示出来,$ 是文本结束 EOF 的表示)。

而 UNIX/Linux 采用 "换行符",即 "LF" 表示下一行,即 "\n";

苹果机(MAC OS系统)则采用 "回车符",即 "CR" 表示下一行,即 "\r";

我们可以设置 Notepad++ 显示换行符,视图 -> 显示符号 -> 显示行尾符,如果是英文版的 Notepad++,则应该是 View -> Show Symbol -> Show End of Line。Windows系统中,我们就可以在文档行尾看到CR、LF等标识。

解决办法

最简单的解决办法就是转换文件格式和平台,比如使用Notepad++打开文件后,右下角会显示行尾规范以及编码格式的信息,在Unix(LF)上右键,即可更改文件的行尾规范,接下来保存即可解决以上问题。

当然,我们也可以在编辑器中打开行尾符显示,然后进行手动编辑。

以上就是Assertion failed: hunk, file ../patch-2.5.9-src/patch.c, line 354错误的解决办法,貌似行数如果变了也是这个问题导致,比如报错信息为Assertion failed: hunk, file patch.c, line 321,但由于我没有碰到这个line 321的问题,所以也不确定是否能解决。