Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.

Compaq Visual Fortran 6.6: Dynamic-Link Library (DLL) and Module

Bakhbergen
Novice
5,807 Views

I need to create and use dynamic-link library (DLL) for Fortran application using Compaq Visual Fortran 6.6. The following code works just fine:

 

    PROGRAM AMAIN1

    IMPLICIT NONE

    REAL(8):: A,B,S

    A = 1D0

    B = 2D0

    CALL SUBRO1(A,B,S)

    PRINT*, 'S = ', S

    END PROGRAM AMAIN1

 

    SUBROUTINE SUBRO1(A,B,S)

    !DEC$ ATTRIBUTES DLLEXPORT :: SUBRO1

    IMPLICIT NONE

    REAL(8):: A,B,S

    S = A + B

    RETURN

    END SUBROUTINE SUBRO1

 

The result is correct:

    S =    3.00000000000000

    Press any key to continue

 

However, if I implement the same algorithm using the module, I get inconsistent result (i.e. zero):

 

    PROGRAM AMAIN2

    USE MODUL2

    A = 1D0

    B = 2D0

    CALL SUBRO2

    PRINT*, 'S = ', S

    END PROGRAM AMAIN2

 

    MODULE MODUL2

    IMPLICIT NONE

    REAL(8):: A,B,S

    END MODULE MODUL2

 

    SUBROUTINE SUBRO2

    !DEC$ ATTRIBUTES DLLEXPORT :: SUBRO2

    USE MODUL2

    S = A + B

    RETURN

    END SUBROUTINE SUBRO2

 

The result is incorrect:

    S =   0.000000000000000E+000

    Press any key to continue

 

As can be seen above, DLL contains only subprogram in both cases (SUBRO1 and SUBRO2, respectively). I have built DLL and LIB files from the visual development environment. The second case (with the use of module) represents the structure of my large source-code so I need to resolve this issue. Any advice would be greatly appreciated.

 

BTW, the same algorithm without using the DLL works well and gives correct result:

 

    PROGRAM AMAIN3

    USE MODUL3

    A = 1D0

    B = 2D0

    CALL SUBRO3

    PRINT*, 'S = ', S

    END PROGRAM AMAIN3

 

    MODULE MODUL3

    IMPLICIT NONE

    REAL(8):: A,B,S

    END MODULE MODUL3

 

    SUBROUTINE SUBRO3

    USE MODUL3

    S = A + B

    RETURN

    END SUBROUTINE SUBRO3

 

The result is correct:

    S =    3.00000000000000

    Press any key to continue

0 Kudos
1 Solution
Steve_Lionel
Honored Contributor III
5,781 Views

I was able to log in to Bakhbergen's PC and eventually figured out the problem.

In CVF 6.6C (and the later Intel compilers), when you USE a module that has a DLLEXPORT directive, that turns into a DLLIMPORT. But it wasn't always this way, and the version he has doesn't have that behavior. Before that change (which my memory says I lobbied for), you had to supply a separately compiled .mod where the source had DLLIMPORT instead of DLLEXPORT. When I did this, the program worked. I don't remember exactly which update had this change.

So what he needs to do is have two versions of MODUL2.f90, one with DLLEXPORT and one with DLLIMPORT. The DLLEXPORT version gets built into the DLL. The DLLIMPORT version would just be compiled (/c) and only the .mod used, not the ,obj, when linking the main program. Messy, I know, which is why we changed it.

We also discussed why he is using that specific old version, and I understand the reasons (which I will not go into further here.)

View solution in original post

0 Kudos
42 Replies
Bakhbergen
Novice
1,903 Views

Please find attached the zipped amain2.map and cmd.docx files.

 

The following command lines have been run:

 

f90 /MD /compile_only modul2.f90

! Creates: 1) modul2.obj 2) modul2.mod

 

f90 /LD subro2.f90 modul2.obj

! Creates: 1) subro2.lib 2) subro2.exp 3) subro2.dll

 

f90 /MD amain2.f90 modul2.obj subro2.lib /link /map & amain2

! Creates 1) amain2.map 2) amain2.lib 3) amain2.exp 4) amain2.exe

Thanks.

0 Kudos
Steve_Lionel
Honored Contributor III
1,903 Views

Oh, I see!

Don't include modul2.obj when you link amain2, as that gets you a local copy of the module.

Use:

df /MD amain2.f90 subro2.lib  & amain2

0 Kudos
Bakhbergen
Novice
1,903 Views

Microsoft Windows [Version 10.0.17134.523]
(c) Корпорация Майкрософт (Microsoft Corporation), 2018. Все права защищены.

C:\Users\bakhb_000>d:

D:\>cd temporaryfolder/ivfcvfforum4

D:\TemporaryFolder\IVFCVFFORUM4>df /MD /compile_only modul2.f90
Compaq Visual Fortran Optimizing Compiler Version 6.6
Copyright 2001 Compaq Computer Corp. All rights reserved.

modul2.f90

D:\TemporaryFolder\IVFCVFFORUM4>df /LD subro2.f90 modul2.obj
Compaq Visual Fortran Optimizing Compiler Version 6.6
Copyright 2001 Compaq Computer Corp. All rights reserved.

subro2.f90
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/entry:_DllMainCRTStartup@12
/ignore:505
/debugtype:cv
/debug:minimal
/pdb:none
C:\Users\BAKHB_~1\AppData\Local\Temp\objFD7E.tmp
modul2.obj
dfordll.lib
msvcrt.lib
dfconsol.lib
dfport.lib
kernel32.lib
/out:subro2.dll
/dll
   Creating library subro2.lib and object subro2.exp

D:\TemporaryFolder\IVFCVFFORUM4>df /MD amain2.f90 subro2.lib & amain2
Compaq Visual Fortran Optimizing Compiler Version 6.6
Copyright 2001 Compaq Computer Corp. All rights reserved.

amain2.f90
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/subsystem:console
/entry:mainCRTStartup
/ignore:505
/debugtype:cv
/debug:minimal
/pdb:none
C:\Users\BAKHB_~1\AppData\Local\Temp\obj2C8D.tmp
subro2.lib
dformd.lib
msvcrt.lib
dfconsol.lib
dfport.lib
kernel32.lib
/out:amain2.exe
obj2C8D.tmp : error LNK2001: unresolved external symbol _MODUL2_mp_A
obj2C8D.tmp : error LNK2001: unresolved external symbol _MODUL2_mp_B
obj2C8D.tmp : error LNK2001: unresolved external symbol _MODUL2_mp_S
amain2.exe : fatal error LNK1120: 3 unresolved externals
'amain2' is not recognized as an internal or external command,
operable program or batch file.

D:\TemporaryFolder\IVFCVFFORUM4>

0 Kudos
gib
New Contributor II
1,903 Views

Out of curiosity, what happens if you put the module code in modul2.f90 inside subro2.f90?  There is really no reason to put it in a separate file.  I don't have df, but with ifort I did this:

ifort /MD /dll subro2.f90

ifort /MD amain2.f90 subro2.lib

You could try this (with df not ifort) and see what it gives.

0 Kudos
Steve_Lionel
Honored Contributor III
1,903 Views

Please show the output of:

dumpbin -exports subro2.dll

0 Kudos
gib
New Contributor II
1,903 Views

I know that wasn't addressed to me, Steve, but this is what I see:

Microsoft (R) COFF/PE Dumper Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file subro2.dll

File Type: DLL

  Section contains the following exports for subro2.dll

    00000000 characteristics
    5C3D1701 time date stamp Tue Jan 15 12:10:57 2019
        0.00 version
           1 ordinal base
           4 number of functions
           4 number of names

    ordinal hint RVA      name

          1    0 00003348 MODUL2_mp_A
          2    1 00003350 MODUL2_mp_B
          3    2 00003358 MODUL2_mp_S
          4    3 00001000 SUBRO2

  Summary

        1000 .data
        1000 .rdata
        1000 .reloc
        1000 .text

0 Kudos
Steve_Lionel
Honored Contributor III
1,903 Views

gib, that's what I would expect to see. But I have to think that Bakhbergen is doing something we're not seeing. I know that by the time of CVF 6.6 (interesting that none of the updates were installed) this absolutely would have worked. Heck, there was a sample that relied on it.

 

0 Kudos
gib
New Contributor II
1,903 Views

It is very odd.

0 Kudos
Bakhbergen
Novice
1,903 Views

Thanks, gib. This simple program represents the structure of our large source-code with 100+ subprograms (subroutines and functions). In our case module is used for declaring a large number of global variables and arrays that can be made available within the main program and any routines we choose.

0 Kudos
gib
New Contributor II
1,903 Views

Bakhbergen, I'm still curious to see the result of that small change with this tiny example.

What does dumpbin give?

0 Kudos
Bakhbergen
Novice
1,903 Views

I hope that this compiler installed on my laptop is working properly.

When I installed Compaq Visual Fortran 6.6 under Windows 10, I did the following:

(1) Open the CD with explorer;

(2) Go to folder x86;

(3) Set file mode of (x86/setup.exe) to run in Compatibility Mode with XP;

(4) execute the setup.exe located inside folder: x86/setup.exe;

(5) Located the file MSDev98\Bin\DFDEV.EXE Set the File Mode to run in Compatibility Mode with XP;

(6) You can apply all updates as usual;

(7) If it fails to run, make sure that the compatibility mode DFDEV.EXE is set to Compatibility Mode with XP.

After Avast antivirus’s attack I added Microsoft (R) Developer Studio (C:\Program Files\Microsoft Visual Studio\Common\MSDEV98\BIN\Dfdev.exe) into Do Not Disturb Mode.

0 Kudos
Bakhbergen
Novice
1,903 Views

gib, I tried changing as per your instruction and making other similar alterations but it didn't work. Would you like to send me anything on that? Sorry my response may be delayed because I live on the other side of the Earth.

0 Kudos
gib
New Contributor II
1,903 Views

I can't really help because I no longer have the CVF compiler.  What did dumpbin give?  Do this:

dumpbin -exports subro2.dll > dumpbin.out

and post dumpbin.out here.

0 Kudos
Bakhbergen
Novice
1,903 Views

Microsoft Windows [Version 10.0.17134.523]
(c) Корпорация Майкрософт (Microsoft Corporation), 2018. Все права защищены.

C:\Users\bakhb_000>D:

D:\>CD TemporaryFolder/IVFCVFFORUM7

D:\TemporaryFolder\IVFCVFFORUM7>df /MD /compile_only modul2.f90
Compaq Visual Fortran Optimizing Compiler Version 6.6
Copyright 2001 Compaq Computer Corp. All rights reserved.

modul2.f90

D:\TemporaryFolder\IVFCVFFORUM7>df /LD subro2.f90 modul2.obj
Compaq Visual Fortran Optimizing Compiler Version 6.6
Copyright 2001 Compaq Computer Corp. All rights reserved.

subro2.f90
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/entry:_DllMainCRTStartup@12
/ignore:505
/debugtype:cv
/debug:minimal
/pdb:none
C:\Users\BAKHB_~1\AppData\Local\Temp\obj2491.tmp
modul2.obj
dfordll.lib
msvcrt.lib
dfconsol.lib
dfport.lib
kernel32.lib
/out:subro2.dll
/dll
   Creating library subro2.lib and object subro2.exp

D:\TemporaryFolder\IVFCVFFORUM7>df /MD amain2.f90 modul2.obj subro2.lib & amain2
Compaq Visual Fortran Optimizing Compiler Version 6.6
Copyright 2001 Compaq Computer Corp. All rights reserved.

amain2.f90
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/subsystem:console
/entry:mainCRTStartup
/ignore:505
/debugtype:cv
/debug:minimal
/pdb:none
C:\Users\BAKHB_~1\AppData\Local\Temp\obj53DE.tmp
modul2.obj
subro2.lib
dformd.lib
msvcrt.lib
dfconsol.lib
dfport.lib
kernel32.lib
/out:amain2.exe
   Creating library amain2.lib and object amain2.exp
 S =   0.000000000000000E+000

D:\TemporaryFolder\IVFCVFFORUM7>dumpbin -exports subro2.dll
Microsoft (R) COFF Binary File Dumper Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file subro2.dll

File Type: DLL

  Section contains the following exports for subro2.dll

           0 characteristics
    5C3E4EF0 time date stamp Wed Jan 16 03:21:52 2019
        0.00 version
           1 ordinal base
           5 number of functions
           5 number of names

    ordinal hint RVA      name

          1    0 00003040 MODUL2_mp_A
          2    1 00003038 MODUL2_mp_B
          3    2 00003030 MODUL2_mp_S
          4    3 00001000 SUBRO2
          5    4 00001000 _SUBRO2@0

  Summary

        1000 .data
        1000 .rdata
        1000 .reloc
        1000 .text

D:\TemporaryFolder\IVFCVFFORUM7>

0 Kudos
Bakhbergen
Novice
1,903 Views

Please find attached the dumpbin.

0 Kudos
gib
New Contributor II
1,903 Views

D:\TemporaryFolder\IVFCVFFORUM7>df /LD subro2.f90 modul2.obj
 

I think Steve suggested /MD.  Shouldn't the following be the command to make the DLL?

df /MD /dll subro2.f90 modul2.f90

This is the command line I used (with ifort in place of df).

0 Kudos
Bakhbergen
Novice
1,903 Views

Steve, gib, your time and effort is greatly appreciated. Would it be convenient for you if I give a remote desktop permission to you? I have to go to work in the morning so I need to have a rest. Have a good day.

0 Kudos
gib
New Contributor II
1,903 Views

I recommend that Steve logs on to your machine, since he's forgotten more than I'll ever know about Fortran.

0 Kudos
mecej4
Honored Contributor III
1,903 Views

Bakhbergen, apart from all that has been said in this thread, please note that applying the last update to CVF6.6C, i.e, an update that would bring your installation to Compaq Visual Fortran 6.6-4088-47D3B (the output of df /what), would still keep your software exposed to the serious bug mentioned in https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/274046 . 

I think that you should give serious consideration to switching to (or at least verifying with) a recent compiler (Ifort, Gfortran, etc.) before accepting the results from your application program.

0 Kudos
Steve_Lionel
Honored Contributor III
5,782 Views

I was able to log in to Bakhbergen's PC and eventually figured out the problem.

In CVF 6.6C (and the later Intel compilers), when you USE a module that has a DLLEXPORT directive, that turns into a DLLIMPORT. But it wasn't always this way, and the version he has doesn't have that behavior. Before that change (which my memory says I lobbied for), you had to supply a separately compiled .mod where the source had DLLIMPORT instead of DLLEXPORT. When I did this, the program worked. I don't remember exactly which update had this change.

So what he needs to do is have two versions of MODUL2.f90, one with DLLEXPORT and one with DLLIMPORT. The DLLEXPORT version gets built into the DLL. The DLLIMPORT version would just be compiled (/c) and only the .mod used, not the ,obj, when linking the main program. Messy, I know, which is why we changed it.

We also discussed why he is using that specific old version, and I understand the reasons (which I will not go into further here.)

0 Kudos
gib
New Contributor II
1,899 Views

Well done, Steve!

0 Kudos
Reply