【问题标题】:gcc -m32 not working on Windows hosted agentsgcc -m32 不适用于 Windows 托管代理
【发布时间】:2021-08-12 18:04:30
【问题描述】:

我使用 vs2017-win2016 映像在托管代理上创建了一个简单的 Azure DevOps 管道:

  1. 准备C文件[PowerShell任务]:

    New-Item "test.c" -ItemType File -Value "int Foo() { return 123; }"
    
  2. 构建 DLL [命令行任务]:

    gcc -v -c test.c -m32
    gcc -v -shared -o test.dll test.o -m32
    

但是第二步失败了:

C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64 -w64-mingw32/bin/ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/ …/…/…/x86_64-w64-mingw32/lib\libuser32.a 时搜索 -luser32 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib/libuser32.a 时搜索 -luser32 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe: 找不到 -luser32 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib/libkernel32.a 时搜索 -lkernel32 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib\libkernel32.a 时搜索 -lkernel32 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib/libkernel32.a 时搜索 -lkernel32 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe: 找不到 -lkernel32 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/搜索 -liconv 时的 x86_64-w64-mingw32/lib/libiconv.a C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib\libiconv.a 时搜索 -liconv C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/搜索 -liconv 时的 x86_64-w64-mingw32/lib/libiconv.a C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe: 找不到 -liconv C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib/libmingw32.a 时搜索 -lmingw32 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib\libmingw32.a 时搜索 -lmingw32 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib/libmingw32.a 时搜索 -lmingw32 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe: 找不到 -lmingw32 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib/libgcc_s.a 时搜索 -lgcc_s C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib\libgcc_s.a 时搜索 -lgcc_s C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib/libgcc_s.a 时搜索 -lgcc_s C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe: 找不到 -lgcc_s C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:在搜索 -lgcc 时跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/.../lib/gcc/x86_64-w64-mingw32/8.1.0/libgcc.a C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:在搜索 -lgcc 时跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/.../lib/gcc/x86_64-w64-mingw32/8.1.0\libgcc.a C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:在搜索 -lgcc 时跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/.../lib/gcc/x86_64-w64-mingw32/8.1.0/libgcc.a C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe: 找不到 -lgcc C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib/libmoldname.a 时搜索 -lmoldname C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib\libmoldname.a 时搜索 -lmoldname C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib/libmoldname.a 时搜索 -lmoldname C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe: 找不到 -lmoldname C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib/libmingwex.a 时搜索 -lmingwex C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib\libmingwex.a 时搜索 -lmingwex C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib/libmingwex.a 时搜索 -lmingwex C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe: 找不到 -lmingwex C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib/libmsvcrt.a 时搜索 -lmsvcrt C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib\libmsvcrt.a 时搜索 -lmsvcrt C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe:跳过不兼容的 C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/ x86_64-w64-mingw32/lib/libmsvcrt.a 时搜索 -lmsvcrt C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin /ld.exe: 找不到 -lmsvcrt

collect2.exe:错误:ld 返回 1 个退出状态

我认为托管代理上的 MinGW 设置不正确,导致无法使用 -m32 选项,因此无法使用 gcc 构建 32 位 DLL。

网上有很多关于类似问题的问题,但我无法从他们那里了解我究竟需要在 64 位 Windows 上做什么才能使 gcc 与 -m32 开关一起工作并构建 32 位 DLL。

虽然我使用 Azure DevOps,但最好通过 choco 或类似的方式(即通过自动化工具)安装所需的软件。

【问题讨论】:

    标签: windows gcc azure-pipelines


    【解决方案1】:

    在 Microsoft 托管的 Windows 代理中,预安装的 MinGW 为 Mingw-w64 8.1.0,未安装 MinGW32

    要在 Microsoft 托管的代理上安装 MinGW32,您需要在管道中执行一些相关的命令行。我搜索并尝试了,但没有发现任何可用的命令可用于在 Windows 上安装 MinGW。

    作为一种解决方法,也许您可​​以尝试在本地 Windows 机器上手动安装 MinGW32,然后在本地 Windows 机器上添加自托管代理来运行管道。

    您可以参考以下文章在 Windows 上安装 MinGW:

    【讨论】:

    • 所以-m32 选项只有在安装了 MinGW32 的情况下才有效?据我所知,它已被弃用,只有 MinGW64 正在维护它应该构建 32 位和 64 位的二进制文件。
    • 在日志中也有类似C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/…/…/…/…/x86_64-w64-mingw32/bin 这样的路径,所以似乎 mingw32 存在,但由于某种原因不起作用。
    【解决方案2】:

    正如 Bright Ran-MSFT 所说,托管代理上没有安装 MinGW32。自托管代理不适合我。

    经过数小时的搜索和尝试不同的解决方案,我终于找到了解决方案。有一个名为winlibs 的项目包含所有编译器,包括可以在 64 位 Windows 上构建 32 位 DLL 的 i686。

    所以我最终在我的管道中使用了这个 PowerShell 脚本:

    Write-Host "Downloading winlibs..."
    Invoke-WebRequest -Uri "https://github.com/brechtsanders/winlibs_mingw/releases/download/11.1.0-12.0.0-9.0.0-r1/winlibs-i686-posix-dwarf-gcc-11.1.0-mingw-w64-9.0.0-r1.zip" -OutFile "winlibs.zip"
    Write-Host "Downloaded."
    
    Write-Host "Extracting winlibs..."
    Expand-Archive -LiteralPath 'winlibs.zip' -DestinationPath "winlibs"
    Write-Host "Extracted."
    
    Write-Host "Building DLL..."
    $gccPath = Get-ChildItem -Path "winlibs" -File -Filter "i686-w64-mingw32-gcc.exe" -Recurse
    
    & $gccPath.FullName -c test.c -m32
    & $gccPath.FullName -shared -o test.dll test.o -m32
    Write-Host "Built."
    

    【讨论】:

    • 嗨@Maxim,很高兴您找到了解决方案,并感谢您分享解决方案。我建议您可以将此答案标记为该主题的解决方案。这对于正在寻找类似问题的解决方案的其他人可能非常有帮助。谢谢。
    • 谢谢。标记答案。
    猜你喜欢
    • 1970-01-01
    • 2015-07-18
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多