Issue
I’ve created a simple Azure DevOps pipeline on hosted agent with vs2017-win2016 image:
Prepare C file [PowerShell task]:
New-Item "test.c" -ItemType File -Value "int Foo() { return 123; }"
Build DLL [CommandLine task]:
gcc -v -c test.c -m32 gcc -v -shared -o test.dll test.o -m32
But the second step failed with:
_
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: skipping incompatible 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 when searching for -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: skipping incompatible 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 when searching for -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: cannot find -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: skipping incompatible 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 when searching for -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: skipping incompatible 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 when searching for -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: skipping incompatible 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 when searching for -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: cannot find -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: skipping incompatible 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 when searching for -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: skipping incompatible 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 when searching for -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: skipping incompatible 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 when searching for -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: cannot find -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: skipping incompatible 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 when searching for -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: skipping incompatible 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 when searching for -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: skipping incompatible 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 when searching for -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: cannot find -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: skipping incompatible 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 when searching for -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: skipping incompatible 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 when searching for -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: skipping incompatible 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 when searching for -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: cannot find -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: skipping incompatible C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/libgcc.a when searching for -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: skipping incompatible C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0\libgcc.a when searching for -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: skipping incompatible C:/ProgramData/Chocolatey/lib/mingw/tools/install/mingw64/bin/…/lib/gcc/x86_64-w64-mingw32/8.1.0/libgcc.a when searching for -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: cannot find -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: skipping incompatible 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 when searching for -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: skipping incompatible 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 when searching for -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: skipping incompatible 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 when searching for -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: cannot find -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: skipping incompatible 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 when searching for -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: skipping incompatible 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 when searching for -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: skipping incompatible 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 when searching for -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: cannot find -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: skipping incompatible 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 when searching for -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: skipping incompatible 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 when searching for -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: skipping incompatible 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 when searching for -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: cannot find -lmsvcrt_
**collect2.exe: error: ld returned 1 exit status**
I suppose something not set up properly with MinGW on hosted agents which leads to -m32
option can’t be used and thus it’s impossible to build 32-bit DLL with gcc.
There are number of questions on the web on the similar problem, but I can't understand from them what I exactly need to do on 64-bit Windows to make gcc work with -m32 switch and build 32-bit DLL.
Sine I use Azure DevOps, it would be great to install required software via choco
or something like that, i.e. via automating tools.
Solution
As Bright Ran-MSFT said there is no MinGW32 installed on hosted agents. Self-hosted agents is not an option for me.
After hours of searching and trying different solutions I finally found the solution. There is a project called winlibs which contains all compilers including i686 which can build 32-bit DLL on 64-bit Windows.
So I ended up with this PowerShell script within my pipeline:
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."
Answered By - Maxim Answer Checked By - Terry (WPSolving Volunteer)