B. Eckles B. Eckles - 11 months ago 72
C++ Question

Why won't my 32-bit Fortran/C DLL compile in MSYS2?

I'm trying to compile a DLL with mixed Fortran/C code on 64-bit Windows 7 in MSYS2 (

msys2-x86_64-20160205
) with gcc (5.3.0). I want to compile it 32-bit. (It works just fine if I leave out the
-m32
flags and compile it 64-bit.)

Being as inexperienced with this sort of thing as I am, I'm likely making some pretty stupid mistakes... so my apologies in advance!

The brick wall I seem to be running into is the following.

I have successfully (I think) installed the 32-bit toolchain, but when I run my Makefile, it seems it can't find it.

Can anyone help to point me in the right direction?

My poorly written Makefile:

FC=gfortran -g -m32
CC=g++ -g -m32

DLL_SRC_DIR=.
BUILD_DIR=build

all:
$(FC) -c $(DLL_SRC_DIR)/fdll.f90 -o $(BUILD_DIR)/fdll.o

$(CC) -c -DBUILDING_C_DLL $(DLL_SRC_DIR)/cdll.cpp -o $(BUILD_DIR)/cdll.o
$(CC) -shared -o $(BUILD_DIR)/libcdll.dll $(BUILD_DIR)/cdll.o $(BUILD_DIR)/fdll.o -Wl,--out-implib,$(BUILD_DIR)/libcdll.a,--output-def,$(BUILD_DIR)/libcdll.def -lgfortran
/c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio\ 12.0/VC/BIN/lib /MACHINE:x86 /DEF:$(BUILD_DIR)\\libcdll.def /OUT:$(BUILD_DIR)\\libcdll.lib

clean:
rm -f $(BUILD_DIR)/*


Running
make
:


$ make
gfortran -g -m32 -c ./fdll.f90 -o build/fdll.o
g++ -g -m32 -c -DBUILDING_C_DLL ./cdll.cpp -o build/cdll.o
g++ -g -m32 -shared -o build/libcdll.dll build/cdll.o build/fdll.o -Wl,--out-implib,build/libcdll.a,--output-def,build/libcdll.def -lgfortran
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libgfortran.dll.a when searching for -lgfortran
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libgfortran.a when searching for -lgfortran
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libgfortran.a when searching for -lgfortran
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libgfortran.dll.a when searching for -lgfortran
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libgfortran.a when searching for -lgfortran
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: cannot find -lgfortran
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libstdc++.dll.a when searching for -lstdc++
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libstdc++.a when searching for -lstdc++
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libstdc++.a when searching for -lstdc++
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libstdc++.dll.a when searching for -lstdc++
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libstdc++.a when searching for -lstdc++
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: cannot find -lstdc++
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: cannot find -lgcc_s
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: cannot find -lgcc
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: cannot find -lmsys-2.0
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/w32api/libadvapi32.a when searching for -ladvapi32
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/w32api/libadvapi32.a when searching for -ladvapi32
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/w32api/libadvapi32.a when searching for -ladvapi32
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: cannot find -ladvapi32
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/w32api/libshell32.a when searching for -lshell32
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/w32api/libshell32.a when searching for -lshell32
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/w32api/libshell32.a when searching for -lshell32
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: cannot find -lshell32
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/w32api/libuser32.a when searching for -luser32
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/w32api/libuser32.a when searching for -luser32
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/w32api/libuser32.a when searching for -luser32
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: cannot find -luser32
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/w32api/libkernel32.a when searching for -lkernel32
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/w32api/libkernel32.a when searching for -lkernel32
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/w32api/libkernel32.a when searching for -lkernel32
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: cannot find -lkernel32
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: cannot find -lgcc_s
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-msys/5.3.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-msys/5.3.0/../../../../x86_64-pc-msys/bin/ld: cannot find -lgcc
collect2: error: ld returned 1 exit status
make: *** [Makefile:12: all] Error 1


Installing the 32-bit toolchain:

$ pacman -S mingw-w64-i686-toolchain
:: There are 16 members in group mingw-w64-i686-toolchain:
:: Repository mingw32
1) mingw-w64-i686-binutils 2) mingw-w64-i686-crt-git 3) mingw-w64-i686-gcc 4) mingw-w64-i686-gcc-ada 5) mingw-w64-i686-gcc-fortran 6) mingw-w64-i686-gcc-libgfortran 7) mingw-w64-i686-gcc-libs 8) mingw-w64-i686-gcc-objc 9) mingw-w64-i686-gdb
10) mingw-w64-i686-headers-git 11) mingw-w64-i686-libmangle-git 12) mingw-w64-i686-libwinpthread-git 13) mingw-w64-i686-make 14) mingw-w64-i686-pkg-config 15) mingw-w64-i686-tools-git 16) mingw-w64-i686-winpthreads-git

Enter a selection (default=all):
resolving dependencies...
looking for conflicting packages...
warning: dependency cycle detected:
warning: mingw-w64-i686-gcc-libgfortran will be installed before its mingw-w64-i686-gcc-libs dependency

Packages (40) mingw-w64-i686-bzip2-1.0.6-5 mingw-w64-i686-ca-certificates-20150426-2 mingw-w64-i686-expat-2.1.1-1 mingw-w64-i686-gdbm-1.12-1 mingw-w64-i686-gettext-0.19.7-1 mingw-w64-i686-gmp-6.1.0-1 mingw-w64-i686-isl-0.16.1-1 mingw-w64-i686-libffi-3.2.1-3
mingw-w64-i686-libiconv-1.14-5 mingw-w64-i686-libsystre-1.0.1-2 mingw-w64-i686-libtasn1-4.8-1 mingw-w64-i686-libtre-git-r122.c2f5d13-4 mingw-w64-i686-mpc-1.0.3-2 mingw-w64-i686-mpfr-3.1.4-3 mingw-w64-i686-ncurses-6.0.20160220-2
mingw-w64-i686-openssl-1.0.2.h-1 mingw-w64-i686-p11-kit-0.23.2-2 mingw-w64-i686-python2-2.7.11-4 mingw-w64-i686-readline-6.3.008-1 mingw-w64-i686-tcl-8.6.5-1 mingw-w64-i686-termcap-1.3.1-2 mingw-w64-i686-tk-8.6.5-1
mingw-w64-i686-windows-default-manifest-6.4-2 mingw-w64-i686-zlib-1.2.8-9 mingw-w64-i686-binutils-2.25.1-5 mingw-w64-i686-crt-git-5.0.0.4680.362c947-1 mingw-w64-i686-gcc-5.4.0-1 mingw-w64-i686-gcc-ada-5.4.0-1 mingw-w64-i686-gcc-fortran-5.4.0-1
mingw-w64-i686-gcc-libgfortran-5.4.0-1 mingw-w64-i686-gcc-libs-5.4.0-1 mingw-w64-i686-gcc-objc-5.4.0-1 mingw-w64-i686-gdb-7.11.1-2 mingw-w64-i686-headers-git-5.0.0.4680.362c947-1 mingw-w64-i686-libmangle-git-5.0.0.4669.7de6266-1
mingw-w64-i686-libwinpthread-git-5.0.0.4670.00cda6f-1 mingw-w64-i686-make-4.1.2351.a80a8b8-1 mingw-w64-i686-pkg-config-0.29.1-1 mingw-w64-i686-tools-git-5.0.0.4669.7de6266-1 mingw-w64-i686-winpthreads-git-5.0.0.4670.00cda6f-1

Total Installed Size: 619.73 MiB

:: Proceed with installation? [Y/n] Y
(40/40) checking keys in keyring [####################################################################################################] 100%
(40/40) checking package integrity [####################################################################################################] 100%
(40/40) loading package files [####################################################################################################] 100%
(40/40) checking for file conflicts [####################################################################################################] 100%
(40/40) checking available disk space [####################################################################################################] 100%
:: Processing package changes...
( 1/40) installing mingw-w64-i686-libiconv [####################################################################################################] 100%
( 2/40) installing mingw-w64-i686-gmp [####################################################################################################] 100%
( 3/40) installing mingw-w64-i686-libwinpthread-git [####################################################################################################] 100%
( 4/40) installing mingw-w64-i686-gcc-libgfortran [####################################################################################################] 100%
( 5/40) installing mingw-w64-i686-gcc-libs [####################################################################################################] 100%
( 6/40) installing mingw-w64-i686-bzip2 [####################################################################################################] 100%
( 7/40) installing mingw-w64-i686-zlib [####################################################################################################] 100%
( 8/40) installing mingw-w64-i686-binutils [####################################################################################################] 100%
( 9/40) installing mingw-w64-i686-headers-git [####################################################################################################] 100%
(10/40) installing mingw-w64-i686-crt-git [####################################################################################################] 100%
(11/40) installing mingw-w64-i686-isl [####################################################################################################] 100%
(12/40) installing mingw-w64-i686-mpfr [####################################################################################################] 100%
(13/40) installing mingw-w64-i686-mpc [####################################################################################################] 100%
(14/40) installing mingw-w64-i686-windows-default-manifest [####################################################################################################] 100%
(15/40) installing mingw-w64-i686-winpthreads-git [####################################################################################################] 100%
(16/40) installing mingw-w64-i686-gcc [####################################################################################################] 100%
(17/40) installing mingw-w64-i686-gcc-ada [####################################################################################################] 100%
(18/40) installing mingw-w64-i686-gcc-fortran [####################################################################################################] 100%
(19/40) installing mingw-w64-i686-gcc-objc [####################################################################################################] 100%
(20/40) installing mingw-w64-i686-expat [####################################################################################################] 100%
(21/40) installing mingw-w64-i686-gettext [####################################################################################################] 100%
(22/40) installing mingw-w64-i686-gdbm [####################################################################################################] 100%
(23/40) installing mingw-w64-i686-libffi [####################################################################################################] 100%
(24/40) installing mingw-w64-i686-libtre-git [####################################################################################################] 100%
(25/40) installing mingw-w64-i686-libsystre [####################################################################################################] 100%
(26/40) installing mingw-w64-i686-ncurses [####################################################################################################] 100%
(27/40) installing mingw-w64-i686-libtasn1 [####################################################################################################] 100%
(28/40) installing mingw-w64-i686-p11-kit [####################################################################################################] 100%
(29/40) installing mingw-w64-i686-ca-certificates [####################################################################################################] 100%
(30/40) installing mingw-w64-i686-openssl [####################################################################################################] 100%
(31/40) installing mingw-w64-i686-termcap [####################################################################################################] 100%
(32/40) installing mingw-w64-i686-readline [####################################################################################################] 100%
(33/40) installing mingw-w64-i686-tcl [####################################################################################################] 100%
(34/40) installing mingw-w64-i686-tk [####################################################################################################] 100%
(35/40) installing mingw-w64-i686-python2 [####################################################################################################] 100%
(36/40) installing mingw-w64-i686-gdb [####################################################################################################] 100%
(37/40) installing mingw-w64-i686-libmangle-git [####################################################################################################] 100%
(38/40) installing mingw-w64-i686-make [####################################################################################################] 100%
(39/40) installing mingw-w64-i686-pkg-config [####################################################################################################] 100%
(40/40) installing mingw-w64-i686-tools-git [####################################################################################################] 100%

Answer Source

No one seems to have wanted to post the answer which we figured out in the comments on the question, so I'm posting it to just tie things up.

I needed to start the shell with the C:\msys64\mingw32.exe executable. See the comments for more details.