- 删除 CLANG_TEST_GUIDE.md 测试指南文档 - 移除 REFACTORING_README.md 重构快速指南 - 删除 REFACTORING_SUMMARY.md 重构总结报告 - 移除 svg-to-ico.js SVG 转 ICO 工具脚本 - 清理 mv.php 文件重命名工具脚本pull/1/head
parent
bbb43664fc
commit
15a6d4196f
7 changed files with 0 additions and 1102 deletions
@ -1,335 +0,0 @@ |
||||
# Windows Clang 支持测试指南 |
||||
|
||||
## ✅ 已完成的修改 |
||||
|
||||
### 1. 代码实现 |
||||
|
||||
#### CompilerBase.php 修改 |
||||
|
||||
**文件位置:** `D:\workspace\compiler\src\Php\CompilerBase.php` |
||||
|
||||
**主要修改:** |
||||
|
||||
1. **detectPlatform() 方法** (第 298-327 行) |
||||
- 添加智能编译器检测 |
||||
- 优先级:PHPX_CC 环境变量 > Clang > MSVC |
||||
- 显示当前使用的编译器信息 |
||||
|
||||
2. **isClangAvailable() 方法** (第 329-370 行) |
||||
- 检测 PATH 中的 clang++ |
||||
- 自动搜索 Visual Studio LLVM 路径 |
||||
- 支持 VS 2019 和 VS 2022 所有版本 |
||||
- 找到后自动添加到 PATH |
||||
|
||||
3. **addCompilationOption() 方法** (第 2410-2425 行) |
||||
- 根据编译器类型分发到不同的处理方法 |
||||
- 支持 MSVC 和 Clang |
||||
|
||||
4. **addWindowsClangCompilationOption() 方法** (第 2543-2647 行) |
||||
- 新增方法,处理 Windows Clang 编译选项 |
||||
- 使用 GCC 风格的编译选项(-std, -O, -Wall) |
||||
- 链接时使用 MSVC 链接器选项 |
||||
- 完整的 Sanitizer 支持 |
||||
|
||||
--- |
||||
|
||||
## 🧪 测试步骤 |
||||
|
||||
### 前置条件 |
||||
|
||||
您需要安装以下之一: |
||||
|
||||
#### 选项 1:Visual Studio LLVM 组件(推荐) |
||||
|
||||
1. 打开 **Visual Studio Installer** |
||||
2. 点击 **修改** 您的 Visual Studio 安装 |
||||
3. 切换到 **单个组件** 标签 |
||||
4. 搜索并勾选: |
||||
- ✅ **Clang compiler for Windows** |
||||
- ✅ **C++ Clang tools for Windows** |
||||
5. 点击 **修改** 开始安装 |
||||
|
||||
#### 选项 2:独立 LLVM 安装 |
||||
|
||||
1. 访问 https://releases.llvm.org/download.html |
||||
2. 下载 **LLVM-{version}-win64.exe** |
||||
3. 运行安装程序 |
||||
4. **重要:** 勾选 "Add LLVM to the system PATH" |
||||
|
||||
--- |
||||
|
||||
### 测试 1:检查 Clang 安装 |
||||
|
||||
运行检查脚本: |
||||
|
||||
```cmd |
||||
cd D:\workspace\compiler |
||||
check-clang.bat |
||||
``` |
||||
|
||||
或使用 PowerShell: |
||||
|
||||
```powershell |
||||
cd D:\workspace\compiler |
||||
.\check-clang.ps1 |
||||
``` |
||||
|
||||
**预期输出:** |
||||
|
||||
如果 Clang 已安装: |
||||
``` |
||||
=== Checking Clang Installation === |
||||
|
||||
1. Checking PATH for clang++: |
||||
Found in PATH |
||||
clang version 17.0.6 |
||||
|
||||
2. Checking Visual Studio paths: |
||||
Found: VS 2022 Community |
||||
clang version 17.0.6 |
||||
|
||||
=== Check Complete === |
||||
``` |
||||
|
||||
如果未安装: |
||||
``` |
||||
Not found in PATH |
||||
Not found in Visual Studio directories |
||||
|
||||
To install LLVM for Visual Studio: |
||||
1. Open Visual Studio Installer |
||||
2. Modify your installation |
||||
... |
||||
``` |
||||
|
||||
--- |
||||
|
||||
### 测试 2:编译器检测 |
||||
|
||||
运行 PHP 测试脚本: |
||||
|
||||
```cmd |
||||
php test-compiler-detection.php |
||||
``` |
||||
|
||||
**预期输出:** |
||||
|
||||
如果使用 Clang: |
||||
``` |
||||
=== Testing Compiler Detection === |
||||
|
||||
Platform Detection: |
||||
isWindows: true |
||||
cppCompiler: clang++ |
||||
cxxStd: c++17 |
||||
|
||||
Clang Detection Test: |
||||
isClangAvailable: true |
||||
|
||||
✓ Clang is available and will be used by default |
||||
|
||||
=== Test Complete === |
||||
``` |
||||
|
||||
如果使用 MSVC: |
||||
``` |
||||
Platform Detection: |
||||
isWindows: true |
||||
cppCompiler: cl |
||||
cxxStd: c++17 |
||||
|
||||
Clang Detection Test: |
||||
isClangAvailable: false |
||||
|
||||
✗ Clang not found, will use MSVC |
||||
|
||||
=== Test Complete === |
||||
``` |
||||
|
||||
--- |
||||
|
||||
### 测试 3:实际编译测试 |
||||
|
||||
#### 测试 3a:使用 Clang 编译 |
||||
|
||||
```cmd |
||||
# 确保 Clang 可用 |
||||
php test-compiler-detection.php |
||||
|
||||
# 编译测试文件 |
||||
php bin/compiler.php test-clang-simple.php |
||||
|
||||
# 运行生成的可执行文件 |
||||
test-clang-simple.exe |
||||
``` |
||||
|
||||
**预期输出:** |
||||
``` |
||||
Hello from PHPX! |
||||
Testing Clang compiler support... |
||||
PHP Version: 8.x.x |
||||
Sum of [1,2,3,4,5] = 15 |
||||
Test completed successfully! |
||||
``` |
||||
|
||||
--- |
||||
|
||||
#### 测试 3b:强制使用 MSVC |
||||
|
||||
```cmd |
||||
# 设置环境变量强制使用 MSVC |
||||
set PHPX_CC=cl |
||||
|
||||
# 编译 |
||||
php bin/compiler.php test-clang-simple.php |
||||
|
||||
# 运行 |
||||
test-clang-simple.exe |
||||
``` |
||||
|
||||
--- |
||||
|
||||
#### 测试 3c:强制使用 Clang |
||||
|
||||
```cmd |
||||
# 设置环境变量强制使用 Clang |
||||
set PHPX_CC=clang++ |
||||
|
||||
# 编译 |
||||
php bin/compiler.php test-clang-simple.php |
||||
|
||||
# 运行 |
||||
test-clang-simple.exe |
||||
``` |
||||
|
||||
--- |
||||
|
||||
### 测试 4:Sanitizer 测试(仅 Clang) |
||||
|
||||
```cmd |
||||
# 使用 AddressSanitizer 编译 |
||||
php bin/compiler.php test-clang-simple.php --sanitize=address |
||||
|
||||
# 运行(如果有内存错误会报告) |
||||
test-clang-simple.exe |
||||
``` |
||||
|
||||
--- |
||||
|
||||
## 📊 验证清单 |
||||
|
||||
完成后,请确认以下功能: |
||||
|
||||
- [ ] Clang 正确安装在系统中 |
||||
- [ ] `isClangAvailable()` 能检测到 Clang |
||||
- [ ] 默认情况下优先使用 Clang(如果可用) |
||||
- [ ] 可以通过 `PHPX_CC` 环境变量切换编译器 |
||||
- [ ] Clang 编译的程序可以正常运行 |
||||
- [ ] MSVC 仍然可以正常工作 |
||||
- [ ] Sanitizer 选项在 Clang 下工作 |
||||
- [ ] 编译时显示正确的编译器信息 |
||||
|
||||
--- |
||||
|
||||
## 🐛 故障排除 |
||||
|
||||
### 问题 1:Clang 未被检测到 |
||||
|
||||
**症状:** `isClangAvailable()` 返回 false |
||||
|
||||
**解决:** |
||||
1. 确认 Clang 已安装 |
||||
2. 检查 PATH 环境变量 |
||||
3. 重启命令行窗口 |
||||
4. 手动添加 Clang 到 PATH: |
||||
```cmd |
||||
set PATH=C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\Llvm\x64\bin;%PATH% |
||||
``` |
||||
|
||||
--- |
||||
|
||||
### 问题 2:编译失败 |
||||
|
||||
**症状:** 编译时出现错误 |
||||
|
||||
**检查:** |
||||
1. 确认使用的是正确的编译器 |
||||
2. 检查 Visual Studio Developer Command Prompt |
||||
3. 查看详细的错误信息 |
||||
|
||||
**尝试:** |
||||
```cmd |
||||
# 清除缓存后重新编译 |
||||
del /s /q *.o 2>nul |
||||
del /s /q *.obj 2>nul |
||||
php bin/compiler.php test.php |
||||
``` |
||||
|
||||
--- |
||||
|
||||
### 问题 3:链接错误 |
||||
|
||||
**症状:** 编译成功但链接失败 |
||||
|
||||
**原因:** Clang on Windows 需要 MSVC 的链接器 |
||||
|
||||
**解决:** |
||||
1. 确保 Visual Studio Build Tools 已安装 |
||||
2. 使用 Developer Command Prompt |
||||
3. 检查 Windows SDK 是否安装 |
||||
|
||||
--- |
||||
|
||||
## 📝 下一步 |
||||
|
||||
如果测试成功,您可以: |
||||
|
||||
1. ✅ 开始在项目中使用 Clang |
||||
2. ✅ 利用 Clang 的 Sanitizers 进行调试 |
||||
3. ✅ 享受更好的错误信息和诊断 |
||||
4. ✅ 为跨平台开发做准备 |
||||
|
||||
--- |
||||
|
||||
## 🔗 相关文档 |
||||
|
||||
- [WINDOWS_CLANG_GUIDE.md](./examples/win32-hello/WINDOWS_CLANG_GUIDE.md) - 完整的使用指南 |
||||
- [YAML_CONFIG_NAMING_CONVENTION.md](./examples/win32-hello/YAML_CONFIG_NAMING_CONVENTION.md) - YAML 配置规范 |
||||
- [CONFIG_PRIORITY_RULES.md](./examples/win32-hello/CONFIG_PRIORITY_RULES.md) - 配置优先级规则 |
||||
|
||||
--- |
||||
|
||||
## 💡 提示 |
||||
|
||||
**快速切换编译器:** |
||||
|
||||
```cmd |
||||
# 使用 Clang |
||||
set PHPX_CC=clang++ |
||||
php bin/compiler.php app.php |
||||
|
||||
# 使用 MSVC |
||||
set PHPX_CC=cl |
||||
php bin/compiler.php app.php |
||||
|
||||
# 自动选择(默认) |
||||
set PHPX_CC= |
||||
php bin/compiler.php app.php |
||||
``` |
||||
|
||||
**永久设置(系统环境变量):** |
||||
|
||||
```cmd |
||||
# 设置为 Clang |
||||
setx PHPX_CC "clang++" |
||||
|
||||
# 设置为 MSVC |
||||
setx PHPX_CC "cl" |
||||
|
||||
# 删除设置(自动选择) |
||||
setx PHPX_CC "" |
||||
``` |
||||
|
||||
--- |
||||
|
||||
祝测试顺利!如有问题,请查看详细文档或报告 bug。 |
||||
@ -1,18 +0,0 @@ |
||||
#!/usr/bin/env php |
||||
<?php |
||||
if ($argc < 2) { |
||||
echo "Usage: php mv.php <file>\n"; |
||||
exit(1); |
||||
} |
||||
$file = $argv[1]; |
||||
if (!file_exists($file)) { |
||||
echo "File not found: " . $file . "\n"; |
||||
exit(1); |
||||
} |
||||
$newFile = str_replace('-raw', '', $file); |
||||
$dir = dirname($newFile); |
||||
if (!is_dir($dir)) { |
||||
mkdir($dir, 0755, true); |
||||
} |
||||
rename($file, $newFile); |
||||
shell_exec('git add ' . $newFile); |
||||
@ -1 +0,0 @@ |
||||
技术交底书该技术应用产品:1、详细介绍技术背景,并描述已有的与本发明最相近似的实现方案(包括两部分:背景技术及现有技术方案[大的技术背景和小的技术背景],应详细介绍,以不需再去看文献即可领会该技术内容为准,如果现有技术出自专利、期刊、书籍,则提供出处)2、现有技术的缺点是什么?针对这些缺点,说明本发明的目的。(客观评价,现有技术的缺点是针对于本发明的优点来说的,本发明不能解决的缺点不必写;基于本发明能解决的问题写出发明的目的)3、本发明技术方案的详细阐述,应该结合示意图进行说明(越详细越好,至少要提供2页;发明中每一功能的实现都要有相应的技术实现方案;所有英文缩写都应有中文注释;所有附图都应该有详细的文字描述,以别人不看附图即可明白技术方案为准;同时附图中的关键词或方框图中的注释都尽量用中文;方法专利都应该提供流程图,并提供相关的系统装置图;附图中各相关部件都要提供名称)。4、本发明的关键点和欲保护点是什么?(发明内容部分提供的是为完成一定功能的完整技术方案,在本部分是提炼出技术方案的关键创新点,列出1、2、3…,以提醒代理人注意,便于代理人撰写权利要求书5、与第1部分最好的现有技术相比,本发明有何优点(结合发明内容简单介绍,一两个自然段即可)注意:1.代理人并不是技术专家,交底书要使代理人能看懂,尤其是背景技术和详细技术方案,一定要写的全面、清楚。2.英文缩写有中文译文,避免使用英文单词,最好在术语解释部分给出。3.全文对同一事物的叫法应统一,避免出现一种东西多种叫法。4.认为需要保密的地方可在交底书中注明,对代理人不必保密。5.专利法规定:1)专利必须是一个技术方案,应该阐述发明目的是通过什么技术方案来实现的,不能只有原理,也 不能只做功能介绍; 2)专利必须充分公开,以本领域技术人员不需付出创造性劳动即可实现为准。 |
||||
@ -1,147 +0,0 @@ |
||||
/** |
||||
* SVG → ICO 转换脚本 (Node.js) |
||||
*
|
||||
* 使用 sharp 库将 SVG 渲染为多尺寸 PNG,再合并为 ICO |
||||
*
|
||||
* 用法: node svg-to-ico.js <input.svg> [output.ico] |
||||
*/ |
||||
|
||||
const sharp = require('sharp'); |
||||
const fs = require('fs'); |
||||
const path = require('path'); |
||||
|
||||
const sizes = [16, 32, 48, 64, 128, 256]; |
||||
|
||||
async function main() { |
||||
const args = process.argv.slice(2); |
||||
if (args.length < 1) { |
||||
console.log('用法: node svg-to-ico.js <input.svg> [output.ico]'); |
||||
process.exit(1); |
||||
} |
||||
|
||||
const inputSvg = path.resolve(args[0]); |
||||
const outputIco = args.length >= 2
|
||||
? path.resolve(args[1])
|
||||
: path.join(path.dirname(inputSvg), path.basename(inputSvg, '.svg') + '.ico'); |
||||
|
||||
if (!fs.existsSync(inputSvg)) { |
||||
console.log(`错误: SVG 文件不存在: ${inputSvg}`); |
||||
process.exit(1); |
||||
} |
||||
|
||||
console.log('=== SVG → ICO 转换工具 ===\n'); |
||||
console.log(`输入: ${inputSvg}`); |
||||
console.log(`输出: ${outputIco}\n`); |
||||
|
||||
const svgBuffer = fs.readFileSync(inputSvg); |
||||
|
||||
// 步骤1: 渲染 SVG 为多个尺寸的 PNG
|
||||
const pngBuffers = {}; |
||||
for (const size of sizes) { |
||||
console.log(`[1/2] 渲染 SVG → PNG (${size}x${size})...`); |
||||
try { |
||||
const pngBuffer = await sharp(svgBuffer, { density: 300 }) |
||||
.resize(size, size, { fit: 'contain', background: { r: 255, g: 255, b: 255, alpha: 1 } }) |
||||
.png() |
||||
.toBuffer(); |
||||
pngBuffers[size] = pngBuffer; |
||||
console.log(` 完成: ${size}x${size} (${pngBuffer.length} bytes)`); |
||||
} catch (err) { |
||||
console.log(` 警告: ${size}x${size} PNG 生成失败: ${err.message},跳过`); |
||||
} |
||||
} |
||||
|
||||
const validSizes = Object.keys(pngBuffers).map(Number).sort((a, b) => a - b); |
||||
if (validSizes.length === 0) { |
||||
console.log('\n错误: 所有尺寸的 PNG 都生成失败'); |
||||
process.exit(1); |
||||
} |
||||
|
||||
// 步骤2: 合并为 ICO
|
||||
console.log('\n[2/2] 合并 PNG → ICO...'); |
||||
const icoBuffer = createIcoFromPngs(pngBuffers, validSizes); |
||||
fs.writeFileSync(outputIco, icoBuffer); |
||||
|
||||
console.log(`\n成功! ICO 文件已生成: ${outputIco}`); |
||||
console.log(`包含尺寸: ${validSizes.join(', ')}`); |
||||
console.log(`文件大小: ${icoBuffer.length} bytes`); |
||||
} |
||||
|
||||
/** |
||||
* 将多个 PNG buffer 合并为 ICO 格式的 Buffer |
||||
*/ |
||||
function createIcoFromPngs(pngBuffers, sizes) { |
||||
const imageCount = sizes.length; |
||||
|
||||
// 计算各部分大小
|
||||
const headerSize = 6; // ICO 头部
|
||||
const dirEntrySize = 16; // 每个目录条目
|
||||
const dirSize = dirEntrySize * imageCount; |
||||
|
||||
let dataOffset = headerSize + dirSize; |
||||
|
||||
// 构建目录条目
|
||||
const dirEntries = []; |
||||
for (const size of sizes) { |
||||
const pngData = pngBuffers[size]; |
||||
const dataSize = pngData.length; |
||||
|
||||
// Width/Height: 0 表示 256
|
||||
const w = size >= 256 ? 0 : size; |
||||
const h = size >= 256 ? 0 : size; |
||||
|
||||
dirEntries.push({ |
||||
width: w, |
||||
height: h, |
||||
colorCount: 0, |
||||
reserved: 0, |
||||
planes: 1, |
||||
bitCount: 32, |
||||
dataSize: dataSize, |
||||
offset: dataOffset |
||||
}); |
||||
|
||||
dataOffset += dataSize; |
||||
} |
||||
|
||||
// 计算总大小
|
||||
let totalSize = headerSize + dirSize; |
||||
for (const size of sizes) { |
||||
totalSize += pngBuffers[size].length; |
||||
} |
||||
|
||||
// 构建 ICO 二进制数据
|
||||
const buffer = Buffer.alloc(totalSize); |
||||
let pos = 0; |
||||
|
||||
// ICO 头部 (6 bytes)
|
||||
buffer.writeUInt16LE(0, pos); pos += 2; // Reserved
|
||||
buffer.writeUInt16LE(1, pos); pos += 2; // Type: 1 = ICO
|
||||
buffer.writeUInt16LE(imageCount, pos); pos += 2; // Image count
|
||||
|
||||
// 目录条目
|
||||
for (const entry of dirEntries) { |
||||
buffer.writeUInt8(entry.width, pos); pos += 1; |
||||
buffer.writeUInt8(entry.height, pos); pos += 1; |
||||
buffer.writeUInt8(entry.colorCount, pos); pos += 1; |
||||
buffer.writeUInt8(entry.reserved, pos); pos += 1; |
||||
buffer.writeUInt16LE(entry.planes, pos); pos += 2; |
||||
buffer.writeUInt16LE(entry.bitCount, pos); pos += 2; |
||||
buffer.writeUInt32LE(entry.dataSize, pos); pos += 4; |
||||
buffer.writeUInt32LE(entry.offset, pos); pos += 4; |
||||
} |
||||
|
||||
// 图像数据
|
||||
for (const size of sizes) { |
||||
const pngData = pngBuffers[size]; |
||||
pngData.copy(buffer, pos); |
||||
pos += pngData.length; |
||||
} |
||||
|
||||
return buffer; |
||||
} |
||||
|
||||
main().catch(err => { |
||||
console.error('错误:', err); |
||||
process.exit(1); |
||||
}); |
||||
Loading…
Reference in new issue