1

以前に lf90 を 32 ビットとしてコンパイルしたサブルーチン sendmsg.f90 を、gcc を 64 ビットとしてコンパイルしようとしています。目的は、gcc でコンパイルされた他の 64 ビット サブルーチンとリンクすることです。

subroutine UpdateDisplay(WINHAND,NTPS,QCANCEL,NITER)
  use win32mod
  implicit none
  integer WINHAND, NTPS, MESSNUM, NITER, QCANCEL
!                SendMessageA is a Windows function
!                  WINHAND = handle of window (from ISDev code)
!                  MESSNUM = message number (assigned by ISDev)
!                  NTPS = number of year iteration currently on (WParam)
!                  DUM = 0 (LParam)  

  MESSNUM = 1114
  QCANCEL = SendMessageA(carg(WINHAND),carg(MESSNUM),carg(NTPS), carg(NITER))

end subroutine

Lahey Fortran 7.5 には、lf90 コンパイラと gcc (gfortran を使用)、および lgf と呼ばれるもの (gcc を使用すると思われますが、そうですか?) が含まれています。

私は Windows プログラミング (および Fortran) の初心者です。gcc でコンパイルされたコードは、Windows API を呼び出すことができますか? ISO_C_BINDING を使用する必要がありますか?

これを行う必要がありますか、それとも lf90 によって作成された .obj ファイルを gcc によって作成された .o ファイルにリンクする必要がありますか?

ご協力いただきありがとうございます!

更新: Windows API を次のように呼び出してみました:

MODULE SND_C
    interface
        integer(C_LONG) FUNCTION SendMessage  &
            (WINHAND,MESSNUM,NTPS, NITER)  &
            bind(C,Name='SendMessage')
            use ISO_C_BINDING
            implicit NONE
            integer(C_LONG), VALUE :: WINHAND
            integer(C_LONG), VALUE :: MESSNUM
            integer(C_LONG), VALUE :: NTPS
            integer(C_LONG), VALUE :: NITER
        end function SendMessage
    end interface
END MODULE SND_C


subroutine UpdateDisplay(WINHAND,NTPS,QCANCEL,NITER)    
  USE ISO_C_BINDING, ONLY: C_LONG
  USE SND_C
  implicit none
  integer(C_LONG) WINHAND, NTPS, MESSNUM, NITER, QCANCEL
!                SendMessageA is a Windows function
!                  WINHAND = handle of window (from ISDev code)
!                  MESSNUM = message number (assigned by ISDev)
!                  NTPS = number of year iteration currently on (WParam)
!                  DUM = 0 (LParam)  

!GCC$ ATTRIBUTES DLLEXPORT :: UpdateDisplay
  MESSNUM = 1114
  QCANCEL = SendMessage(WINHAND,MESSNUM,NTPS, NITER)

end subroutine

しかし、「gcc -m64 sendmsg.f90」でコンパイルしようとすると、エラーが発生します。

C:\Users\StephanieJ\Documents\Lahey-Fujitsu Fortran>gcc -m64 sendmsg.f90
c:/progra~2/lahey-~1/v7.5/gcc-gf~1/bin/../lib/gcc/x86_64-w64-mingw32/4.7.4/../..
/../../x86_64-w64-mingw32/lib/../lib/crt2.o: In function `__tmainCRTStartup':
c:\gccbuild\mingw-crt\build32-64\mingw-w64-crt/../../mingwsvn/mingw-w64-crt/crt/
crtexe.c:323: undefined reference to `__laheypause'
C:\Users\STEPHA~2\AppData\Local\Temp\ccWjjo5b.o:sendmsg.f90:(.text+0x3e): undefi
ned reference to `SendMessage'
c:/progra~2/lahey-~1/v7.5/gcc-gf~1/bin/../lib/gcc/x86_64-w64-mingw32/4.7.4/../..
/../../x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o):
In function `main':
c:\gccbuild\mingw-crt\build32-64\mingw-w64-crt/../../mingwsvn/mingw-w64-crt/crt/
crt0_c.c:18: undefined reference to `WinMain'
collect2.exe: error: ld returned 1 exit status

このアプローチは理にかなっていますか?SendMessage への参照が定義されていないのはなぜですか?

4

1 に答える 1