# 编译报错“(is the command line too long?)”

**问题现象**

Native工程编译报错，出现告警和报错信息。

出现工程目录长度超过250字符的告警，示例如下：

出现编译报错“(is the command line too long?)”，示例如下：

**解决措施**

CMAKE\_OBJECT\_PATH\_MAX的默认值为250，是CMake 中用于限制object file路径长度的变量。它的作用是在生成构建系统时，避免编译器或操作系统由于路径过长导致的问题。如果项目中对象文件的实际路径长度超过此值，编译将失败并报告错误。理论上CMake对CMAKE\_OBJECT\_PATH\_MAX没有最大限制，但操作系统和工具链会对路径长度有所限制，具体的值需要查询操作系统和工具链的介绍。

开发者需根据object file的实际路径长度，在工程的CMakeLists.txt中设置CMAKE\_OBJECT\_PATH\_MAX的大小。具体方法如下：

*   方法一：在CMAKE\_OBJECT\_PATH\_MAX默认值基础上增加一个文件名长度。
    
    示例中告警文件为TextMeasureCache.cpp.obj，长度为24字符。在默认值250的基础上增加24，即设置set(CMAKE\_OBJECT\_PATH\_MAX 274)。
    
*   方法二：根据object file实际路径长度计算CMAKE\_OBJECT\_PATH\_MAX。
    
    计算公式：CMAKE\_OBJECT\_PATH\_MAX = 总路径长度 - 目录部分长度 + 32，减去目录部分长度是因为CMake会将目录路径转换为哈希值，只需计算文件名部分的长度
    
    *   总路径长度为 object file directory 长度加上 object file 长度，两者之和为 297 个字符，具体如图所示。
        
    *   object file中目录部分长度：示例中“\_\_/\_\_/\_\_/\_\_/\_\_/third-party/rn/ReactCommon/react/renderer/textlayoutmanager”长度为74字符，具体以实际为准。
    *   CMake哈希值字符数：CMake将长路径转换为哈希值时哈希值的长度固定为32。
    
    代入示例中的长度后，计算可得：CMAKE\_OBJECT\_PATH\_MAX = 297 - 74 + 32 = 255。设置 set(CMAKE\_OBJECT\_PATH\_MAX 255)。
    
*   方法三：如果设置 CMAKE\_OBJECT\_PATH\_MAX 后仍然出现相同错误，需要将工程存放在较短的目录下。