GitHub Action中SonarCloud扫描C++代码报错:未分析到C/C++文件
针对你遇到的build-wrapper-dump.json存在但无C++文件被分析的错误,结合你的GitHub Action步骤,以下是具体排查和修复方案:
1. 给SonarCloud扫描指定build-wrapper输出目录
你的SonarCloud扫描步骤缺少关键配置,必须明确告诉扫描器build-wrapper生成文件的位置。修改该步骤:
- name: SonarCloud Scan uses: SonarSource/sonarcloud-github-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} with: args: -Dsonar.cfamily.build-wrapper-output=bw-output
若仓库未在SonarCloud完成关联,还需补充-Dsonar.projectKey=你的项目Key和-Dsonar.organization=你的组织名参数。
2. 确保build-wrapper包裹完整的干净编译流程
当前clean和build步骤分开执行,可能导致build阶段因CMake判定文件无需更新而跳过编译,使build-wrapper无法捕获编译命令。修改build-wrapper步骤,让它直接包裹清理+编译的完整流程:
- name: Run build-wrapper run: | cmake --build C++/build1/ --target clean # 用build-wrapper包裹带clean-first的编译命令,强制重新编译 C++/build1/build-wrapper-linux-x86-64 --out-dir bw-output cmake --build C++/build1 --clean-first
--clean-first参数会让CMake先清理所有构建产物再重新编译,确保build-wrapper能捕获到所有C++文件的编译动作。
3. 分离build-wrapper与CMake构建目录
你将build-wrapper安装到了CMake的构建目录C++/build1/中,cmake生成的构建文件可能会与build-wrapper文件冲突。建议把build-wrapper放到独立目录:
- name: Install build-wrapper run: | wget https://sonarcloud.io/static/cpp/build-wrapper-linux-x86.zip unzip build-wrapper-linux-x86.zip mkdir -p build-wrapper mv build-wrapper-linux-x86/* build-wrapper/ chmod +x build-wrapper/build-wrapper-linux-x86-64
后续调用时使用build-wrapper/build-wrapper-linux-x86-64路径,避免与构建目录的文件混淆。
4. 验证CMake能正确识别并编译.cpp文件
在Configure步骤后添加验证步骤,确认CMake生成了正确的C++编译规则:
- name: Check CMake Build Rules run: | cd C++/build1 grep -r "\.cpp" Makefile || echo "未找到C++编译规则,请检查CMakeLists.txt配置"
如果未找到相关规则,说明你的CMakeLists.txt存在配置问题,需先确保CMake能正确识别项目中的.cpp文件并生成编译任务。
5. 确认build-wrapper捕获到编译命令
执行完build-wrapper步骤后,检查bw-output/build-wrapper-dump.json中的commands数组。如果该数组为空,说明build-wrapper未捕获到任何编译动作,需重新检查包裹的命令是否正确——比如是否在正确的工作目录执行,或者编译命令是否被跳过。
内容的提问来源于stack exchange,提问作者Teeramet.K

