1

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%
B. Eckles
  • 1,626
  • 2
  • 15
  • 27
  • 1
    Do you need msys? What about the native Windows MinGW? – Vladimir F Героям слава Oct 13 '16 at 16:55
  • Well I was only ever able to get stuff to compile on MSYS2. Some of the code I run does stuff like write to `/dev/null`, which apparently doesn't exist properly on MinGW, if I remember correctly. – B. Eckles Oct 13 '16 at 16:57
  • 1
    Are you running the 32 bit compiler? What does `which gfortran` return - it should be `/mingw32/bin`. If not, then you are in the wrong shell environment. – IanH Oct 13 '16 at 23:59
  • 4
    Actually, looking at the error messages I can be categoric - you are in the wrong shell environment. You are running the compiler that targets msys itself (see the `x86_64-pc-msys` path component). What you show being installed (and what you want to run) is the compiler for `i686-w64-mingw32`. How are you starting your shell? – IanH Oct 14 '16 at 07:57
  • 1
    IanH is right. Make sure you are starting a MinGW 32-bit shell. The `MSYSTEM` environment variable should be `MINGW32` and `which g++` should return `/mingw32/bin/g++`. – David Grayson Oct 18 '16 at 04:22
  • Fantastic guys, thank you! I've been busy on a few other things recently, which is why I haven't commented back. I'm switching back over to this now though. I'd looked into MSYS32, but according to the site (https://sourceforge.net/p/msys2/wiki/MSYS2%20installation/), "if you are using 64-bit Windows, there is no reason to use 32-bit MSYS2"... But I'll give it a shot! – B. Eckles Oct 19 '16 at 13:19
  • Well that fixed it! Installed and used the 32-bit version of MSYS2 instead, updating my Windows PATH appropriately, and it works! (https://msys2.github.io/ -- msys2-i686-20160921.exe) If you add this as an answer, @IanH, I'll accept it. – B. Eckles Oct 19 '16 at 15:51
  • 1
    It is not the 32 bit version of msys that you must have, it is the compiler that targets 32 bit windows. Your post shows that you installed this compiler... but you then weren't running it. You had started the wrong shell. – IanH Oct 19 '16 at 23:47
  • @IanH Ah. You are correct, unsurprisingly! I just noticed that there's another executable in my `C:\msys64` directory: `mingw32.exe`. When I run that, my `Makefile` runs just fine. Thank you! – B. Eckles Oct 20 '16 at 13:31
  • @DavidGrayson mentioned this more specifically, and you were starting to reference it, but I didn't realize it specifically meant that executable, or that it existed, or whatever. – B. Eckles Oct 20 '16 at 13:54

1 Answers1

3

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.

B. Eckles
  • 1,626
  • 2
  • 15
  • 27