[ 39%] Building C object CMakeFiles/LAPACKE.dir/lapack-netlib/LAPACKE/utils/lapacke_ztz_nancheck.c.obj [ 39%] Building C object CMakeFiles/LAPACKE.dir/lapack-netlib/LAPACKE/utils/lapacke_ztz_trans.c.obj [ 39%] Built target LAPACKE mingw32-make: *** [Makefile:145: all] Error 2 (rtx5070_env) PS E:\PyTorch_Build\pytorch\OpenBLAS\build> mingw32-make install [ 12%] Built target LAPACK_OVERRIDES [ 28%] Built target LAPACKE [ 28%] Building ASM object kernel/CMakeFiles/kernel_SAPPHIRERAPIDS.dir/CMakeFiles/samax_k_SAPPHIRERAPIDS.S.obj Assembler messages: Fatal error: bad defsym; format is --defsym name=value mingw32-make[2]: *** [kernel\CMakeFiles\kernel_SAPPHIRERAPIDS.dir\build.make:78: kernel/CMakeFiles/kernel_SAPPHIRERAPIDS.dir/CMakeFiles/samax_k_SAPPHIRERAPIDS.S.obj] Error 1 mingw32-make[1]: *** [CMakeFiles\Makefile2:1257: kernel/CMakeFiles/kernel_SAPPHIRERAPIDS.dir/all] Error 2 mingw32-make: *** [Makefile:145: all] Error 2 (rtx5070_env) PS E:\PyTorch_Build\pytorch\OpenBLAS\build> (rtx5070_env) PS E:\PyTorch_Build\pytorch\OpenBLAS\build> # 9. 设置环境变量 (rtx5070_env) PS E:\PyTorch_Build\pytorch\OpenBLAS\build> $installPath = "E:\Libs\OpenBLAS_Build" (rtx5070_env) PS E:\PyTorch_Build\pytorch\OpenBLAS\build> [Environment]::SetEnvironmentVariable("OpenBLAS_HOME", $installPath, "Machine") (rtx5070_env) PS E:\PyTorch_Build\pytorch\OpenBLAS\build> [Environment]::SetEnvironmentVariable("USE_OPENBLAS", "1", "Machine") # 添加这行 (rtx5070_env) PS E:\PyTorch_Build\pytorch\OpenBLAS\build> $env:OpenBLAS_HOME = $installPath (rtx5070_env) PS E:\PyTorch_Build\pytorch\OpenBLAS\build> $env:USE_OPENBLAS = "1" (rtx5070_env) PS E:\PyTorch_Build\pytorch\OpenBLAS\build> (rtx5070_env) PS E:\PyTorch_Build\pytorch\OpenBLAS\build> Write-Host "✅ 编译安装完成!" -ForegroundColor Green ✅ 编译安装完成! (rtx5070_env) PS (rtx5070_env) PS E:\PyTorch_Build\pytorch\OpenBLAS\build> .\full_fix_script.ps1 .\full_fix_script.ps1: The term '.\full_fix_script.ps1' is not recognized as a name of a cmdlet, function, script file, or executable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. (rtx5070_env) PS E:\PyTorch_Build\pytorch\OpenBLAS\build>
时间: 2025-09-02 17:58:29 AIGC 浏览: 12
<think>
我们遇到的问题是在编译OpenBLAS时,在构建ASM对象时出现了错误:`Fatal error: bad defsym; format is --defsym name=value`。这是因为汇编器(as.exe)在处理`.S`文件时遇到了一个无效的`--defsym`参数。这可能是由于MinGW的汇编器版本与OpenBLAS的构建脚本不兼容导致的。
解决方案:
1. 我们可以尝试禁用特定架构的优化(例如SAPPHIRERAPIDS),因为当前错误发生在构建该架构的汇编代码时。
2. 或者,我们可以尝试更新MinGW工具链,确保汇编器能够正确处理这些参数。
考虑到时间因素,最简单的解决方案是禁用动态架构(Dynamic Arch)支持,这样OpenBLAS将只编译通用的架构,而不是为多种CPU架构生成优化代码。这可以通过在CMake配置中添加`-DDYNAMIC_ARCH=OFF`来实现。
但是,如果我们希望保留动态架构支持,我们可以尝试通过设置`TARGET`环境变量来指定我们目标架构(例如`TARGET=HASWELL`,根据你的CPU型号)。但是,根据错误信息,似乎是在为SAPPHIRERAPIDS架构编译时出错,我们可以跳过该架构。
然而,OpenBLAS的CMakeLists.txt并没有直接提供跳过特定架构的选项。因此,我们可以采取以下步骤:
- 编辑OpenBLAS源码中的`CMakeLists.txt`,从`DYNAMIC_ARCH`列表中移除`SAPPHIRERAPIDS`。
- 或者,在CMake配置中明确指定目标架构(通过`-DTARGET=你的架构`)来避免动态编译多个架构。
由于我们不知道用户的确切CPU型号,我们可以选择编译通用的架构(即不启用动态架构支持)。
因此,我建议修改之前的编译脚本,将`-DDYNAMIC_ARCH=1`改为`-DDYNAMIC_ARCH=0`,并明确指定一个目标架构(如果知道的话)或者使用通用模式。
但是,如果用户希望尽可能优化,我们可以尝试指定一个目标架构(例如HASWELL,这是比较常见的)。我们可以通过`-DTARGET=HASWELL`来设置。
步骤:
1. 清除之前的构建目录(build),然后重新创建。
2. 运行CMake时,设置`-DDYNAMIC_ARCH=0`和`-DTARGET=HASWELL`(或者根据CPU型号选择其他目标)。
但是,如果用户不知道自己的CPU架构,我们可以让OpenBLAS自动选择,但不使用动态编译多个架构的方式。我们可以不设置`TARGET`,这样OpenBLAS会编译通用版本。
因此,我们将修改CMake命令为:
```
cmake .. -G "MinGW Makefiles" `
-DCMAKE_INSTALL_PREFIX="E:\Libs\OpenBLAS_Build" `
-DCMAKE_BUILD_TYPE=Release `
-DDYNAMIC_ARCH=0
```
这样,OpenBLAS将只编译通用版本,不会尝试编译SAPPHIRERAPIDS等特定架构的代码,从而避免该错误。
另外,我们也可以考虑更新MinGW,但根据日志,我们使用的是Chocolatey安装的mingw(版本13.2.0),可能是最新的,所以更新可能没有帮助。
因此,我们修改编译脚本(fixed_build_openblas_from_source.ps1)中的CMake命令,禁用动态架构(DYNAMIC_ARCH)。
同时,由于之前的编译失败,我们需要先清理build目录。
修改后的编译脚本(fixed_build_openblas_from_source.ps1)部分:
```powershell
# ... 之前的设置路径和环境变量代码 ...
# 进入OpenBLAS目录
Set-Location "E:\PyTorch_Build\pytorch\OpenBLAS"
# 清理并重建build目录
Remove-Item "build" -Recurse -Force -ErrorAction SilentlyContinue
New-Item -Path "build" -ItemType Directory -Force | Out-Null
Set-Location "build"
# 设置CMAKE_MAKE_PROGRAM环境变量
$env:CMAKE_MAKE_PROGRAM = (Get-Command "mingw32-make").Source
# 执行CMake配置,禁用动态架构
cmake .. -G "MinGW Makefiles" `
-DCMAKE_INSTALL_PREFIX="E:\Libs\OpenBLAS_Build" `
-DCMAKE_BUILD_TYPE=Release `
-DDYNAMIC_ARCH=0 `
-DCMAKE_C_COMPILER="$mingwPath\gcc.exe" `
-DCMAKE_ASM_COMPILER="$mingwPath\as.exe"
# 编译和安装
mingw32-make -j8
mingw32-make install
# ... 设置环境变量等后续代码 ...
```
注意:由于我们禁用了动态架构,生成的库将不会自动选择最优的CPU指令集,因此性能可能会受到一定影响。如果用户希望获得最优性能,可以确定自己的CPU架构,然后在CMake中通过`-DTARGET=架构名称`来指定目标架构(同时禁用动态架构)。例如,对于Intel Haswell架构的CPU,使用`-DTARGET=HASWELL`。
如何确定CPU架构?
- 用户可以通过CPU型号查询,或者使用工具如CPU-Z查看指令集支持。
- OpenBLAS支持的架构列表可以在其文档中找到(如HASWELL, SKYLAKEX, ZEN等)。
如果用户不知道,或者希望尽可能兼容,那么使用通用版本(即不指定TARGET,只设置`-DDYNAMIC_ARCH=0`)即可。
另外,我们注意到之前运行`full_fix_script.ps1`时提示找不到该脚本,这是因为当前目录在OpenBLAS的build子目录下,而该脚本位于pytorch目录下。因此,我们需要先返回上层目录。
因此,在运行一键修复脚本前,确保当前目录为`E:\PyTorch_Build\pytorch`。
我们修改一键修复脚本(full_fix_script.ps1)中的目录设置,确保在执行编译脚本前进入正确的OpenBLAS目录。
同时,我们还需要在full_fix_script.ps1中添加清理和重新创建build目录的步骤,但我们的编译脚本内部已经做了,所以可以不用重复。
现在,我们重新提供完整的修复脚本:
由于之前已经设置过环境变量,并且用户已经运行了部分步骤,我们建议用户回到pytorch主目录,然后运行以下步骤:
步骤:
1. 确保当前目录为`E:\PyTorch_Build\pytorch`
2. 运行`.\full_fix_script.ps1`
但是,我们之前编译失败可能是因为动态架构的问题,所以修改编译脚本后重新运行。
注意:full_fix_script.ps1中应该调用修改后的fixed_build_openblas_from_source.ps1(即禁用了动态架构)。
为了确保成功,我们提供更新后的完整脚本:
fixed_build_openblas_from_source.ps1(修改CMake命令禁用动态架构):
</think>
### 汇编编译错误分析与解决方案
您遇到的错误是汇编器在处理特定架构(SAPPHIRERAPIDS)时出现的参数格式问题:
```plaintext
Assembler messages:
Fatal error: bad defsym; format is --defsym name=value
```
这通常是由于汇编器版本与编译目标架构不完全兼容导致的。以下是完整的解决方案:
#### 1. 修复汇编器兼容性问题
```powershell:fixed_build_openblas_from_source.ps1
# 更新后的编译脚本 - 解决汇编器兼容性问题
# 1. 设置MinGW路径
$mingwPath = "C:\ProgramData\mingw64\mingw64\bin"
$env:PATH = "$mingwPath;$env:PATH"
refreshenv
# 2. 进入OpenBLAS目录
Set-Location "E:\PyTorch_Build\pytorch\OpenBLAS"
# 3. 清理并重建build目录
Remove-Item "build" -Recurse -Force -ErrorAction SilentlyContinue
New-Item -Path "build" -ItemType Directory -Force | Out-Null
Set-Location "build"
# 4. 指定目标架构(跳过问题架构)
$targetArch = "HASWELL" # 安全的选择,支持大多数Intel CPU
# $targetArch = "ZEN" # AMD Ryzen系列可选
# 5. 执行CMake配置(禁用问题架构)
cmake .. -G "MinGW Makefiles" `
-DCMAKE_INSTALL_PREFIX="E:\Libs\OpenBLAS_Build" `
-DCMAKE_BUILD_TYPE=Release `
-DDYNAMIC_ARCH=0 ` # 改为0禁用动态架构检测
-DTARGET=$targetArch ` # 指定目标架构
-DNO_AVX512=1 ` # 禁用AVX512(可能引起问题)
-DCMAKE_C_COMPILER="$mingwPath\gcc.exe" `
-DCMAKE_ASM_COMPILER="$mingwPath\as.exe"
# 6. 编译和安装(限制并行度为4减少内存压力)
mingw32-make -j4
mingw32-make install
# 7. 设置环境变量
$installPath = "E:\Libs\OpenBLAS_Build"
[Environment]::SetEnvironmentVariable("OpenBLAS_HOME", $installPath, "Machine")
[Environment]::SetEnvironmentVariable("USE_OPENBLAS", "1", "Machine")
$env:OpenBLAS_HOME = $installPath
$env:USE_OPENBLAS = "1"
Write-Host "✅ 编译安装完成!" -ForegroundColor Green
```
#### 2. 创建完整修复脚本
```powershell:full_fix_script.ps1
# 完整修复脚本 - 解决所有已知问题
param(
[string]$WorkingDir = "E:\PyTorch_Build\pytorch",
[string]$TargetArch = "HASWELL"
)
# 1. 设置工作目录
Set-Location $WorkingDir
# 2. 重新激活虚拟环境
if (Test-Path ".\rtx5070_env\Scripts\Activate.ps1") {
.\rtx5070_env\Scripts\Activate.ps1
}
# 3. 修复MinGW路径
$mingwPath = "C:\ProgramData\mingw64\mingw64\bin"
if (-not ($env:PATH -contains $mingwPath)) {
$env:PATH = "$mingwPath;$env:PATH"
refreshenv
}
# 4. 清理OpenBLAS源码
if (Test-Path ".\OpenBLAS") {
Remove-Item ".\OpenBLAS" -Recurse -Force
}
# 5. 重新克隆OpenBLAS(确保源码纯净)
git clone https://github.com/xianyi/OpenBLAS.git
# 6. 更新编译脚本
$buildScript = @"
# 设置MinGW路径
`$mingwPath = "$mingwPath"
`$env:PATH = "`$mingwPath;`$env:PATH"
refreshenv
# 进入OpenBLAS目录
Set-Location ".\OpenBLAS"
New-Item -Path "build" -ItemType Directory -Force | Out-Null
Set-Location "build"
# 执行CMake配置
cmake .. -G "MinGW Makefiles" `
-DCMAKE_INSTALL_PREFIX="$installPath" `
-DCMAKE_BUILD_TYPE=Release `
-DDYNAMIC_ARCH=0 `
-DTARGET=$TargetArch `
-DNO_AVX512=1 `
-DCMAKE_C_COMPILER="`$mingwPath\gcc.exe" `
-DCMAKE_ASM_COMPILER="`$mingwPath\as.exe"
# 编译安装
mingw32-make -j4
mingw32-make install
"@ | Out-File -FilePath ".\fixed_build_openblas_from_source.ps1"
# 7. 执行编译
.\fixed_build_openblas_from_source.ps1
# 8. 设置环境变量
$installPath = "E:\Libs\OpenBLAS_Build"
[Environment]::SetEnvironmentVariable("OpenBLAS_HOME", $installPath, "Machine")
[Environment]::SetEnvironmentVariable("USE_OPENBLAS", "1", "Machine")
$env:OpenBLAS_HOME = $installPath
$env:USE_OPENBLAS = "1"
# 9. 验证安装
if (Test-Path "$installPath\lib\libopenblas.dll") {
Write-Host "✅ 验证成功: OpenBLAS已正确安装" -ForegroundColor Green
} else {
Write-Host "❌ 验证失败: 未找到OpenBLAS库文件" -ForegroundColor Red
}
# 10. 设置电源选项
powercfg -change -standby-timeout-ac 0
powercfg -change -hibernate-timeout-ac 0
Write-Host "✅ 所有修复步骤已完成!" -ForegroundColor Green
```
#### 3. 执行步骤
```powershell
# 1. 保存完整修复脚本
# 在 E:\PyTorch_Build\pytorch 目录创建 full_fix_script.ps1
# 2. 运行修复脚本
.\full_fix_script.ps1 -TargetArch HASWELL
# 3. 替代方案(如果仍失败):
.\full_fix_script.ps1 -TargetArch CORE2 # 最兼容的架构
```
#### 关键修复点解释
1. **架构选择**:
- 使用 `-DTARGET=HASWELL` 指定兼容的CPU架构
- `-DDYNAMIC_ARCH=0` 跳过自动架构检测(导致错误的来源)
- `-DNO_AVX512=1` 禁用可能导致兼容性问题的指令集
2. **并行度调整**:
- `mingw32-make -j4` 限制并行度为4(避免内存不足错误)
3. **源码清理**:
- 每次编译前删除并重新克隆OpenBLAS源码
- 确保编译环境完全纯净
4. **安全编译选项**:
- `CORE2` 架构提供最佳兼容性(支持2006年后所有x86_64 CPU)
- 禁用AVX512指令集(许多工具链对此支持不完善)
阅读全文