编译未修改的MPC-BE源码时出现C1017错误求助
大家好,我最近在尝试给开源播放器MPC-BE加个外部程序读取播放状态的功能,严格按照官方Compilation.txt和README的步骤编译源码,结果遇到了一堆C1017错误,折腾了好久没解决,来求助各位大佬!
先给大家理清楚我的操作和环境:
- 系统:Windows 11 Pro 64位(日语区域)
- 编译工具:VS2022 Community 17.10.1,装了Desktop C++、MSVC v143、Windows SDK 10.0.22621.0、ATL/MFC;MinGW GCC14.2.1放在C:\MSYS,环境变量也配置好了,update_gcc.bat运行成功
- 源码:用
git clone --recursive拉的master分支 - 构建命令:PowerShell里执行
.\build.bat Clean All NoWait .\build.bat Build Packages NoWait
结果一堆错误,都是类似这样的:
Error,C1017,invalid integer constant expression,VideoRenderers,include\Version.h,65
我把文件路径简化后,发现所有错误都指向Version.h第65行,而且我完全没改过源码!
后来我打开Version.h和自动生成的revision.h一看,终于找到问题了:
Version.h里有这么一段预处理器判断:
#if MPC_VERSION_STATUS == 1 && MPC_VERSION_REV == 0
而MPC_VERSION_REV是REV_NUM的别名,再看revision.h里的定义,居然是:
#define REV_NUM long
这哪是整数常量啊!预处理器在处理#if的时候,需要的是具体的数字,结果拿到的是long这个关键字,直接就报错C1017了!
再看revision.h里其他宏,都是git命令字符串,比如REV_DATE是"""git.exe"" log -1 --date=format:%Y-%m-%d --pretty=format:%ad",这明显是模板里的占位内容,根本没被替换成实际的git提交信息!
问题原因
MPC-BE的构建脚本本来应该自动调用git命令,把当前分支、提交数、日期这些信息生成正确的revision.h,但可能因为我的环境里git没在全局PATH里,或者构建脚本执行时没正确调用到git,导致生成revision.h的步骤失败,直接用了默认的模板内容,才会出现这种错误。
解决步骤
我试了两种方法都成功了,给大家分享:
方法一:手动修正revision.h
直接把revision.h里的占位内容改成实际的常量,比如我自己的分支是master,提交数是1890,日期是2024-06-10,就改成这样:
#pragma once #define REV_DATE "2024-06-10" #define REV_BRANCH "master" #define REV_HASH "a1b2c3d" #define REV_NUM 1890
改完之后再重新运行构建命令,错误就消失了。
方法二:让构建脚本自动生成正确的revision.h
- 先确保git.exe在系统的PATH环境变量里:打开命令提示符,输入
git --version,如果能正常显示版本号就没问题;如果不行,就把git的安装目录(比如C:\Program Files\Git\cmd)加到系统PATH里,重启PowerShell。 - 删除当前的revision.h文件
- 进入MPC-BE源码根目录,运行下面的PowerShell命令,手动触发生成正确的revision.h:
# 获取提交计数作为REV_NUM $revNum = git rev-list --count HEAD # 获取最后一次提交的日期 $revDate = git log -1 --date=format:%Y-%m-%d --pretty=format:%ad # 获取当前分支名 $revBranch = git symbolic-ref --short HEAD # 获取短提交哈希 $revHash = git rev-parse --short HEAD # 写入revision.h @" #pragma once #define REV_DATE "$revDate" #define REV_BRANCH "$revBranch" #define REV_HASH "$revHash" #define REV_NUM $revNum "@ | Out-File -Encoding utf8 revision.h
- 然后再运行
.\build.bat Build Packages NoWait,就能正常编译了。
现在我已经成功编译出MPC-BE的安装包了,希望这个解决方法能帮到遇到同样问题的朋友!
内容来源于stack exchange

