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

Exporting commons

kolber__Michael
New Contributor I
436 Views

I am working on a program inversion 2108 of parallel fortran.  The program has a main executable communicating with a dll.  I used the information in the article "coding requirements for sharing data in DLL's".

I have a common named Reserves, and a subroutine call GetReserveFund.  The following statement was added to the main program:

       !Dec$ATTRIBUTE DLLEXPORT :: GETRESERVEFUND,  /Reserves/

I then added this code the main program:

       !Dec$ATTRIBUTE DLLIMPORT :: GETRESERVEFUND, /Reserves/

When I run the program I get the following run time error:

FortranTest.Exe - Entry Point Not Found.

The procedure entry point Reserves could not be located in the dynamic link library cfx_fortran_dll.dll.

I am trying to pass a common block, why does it think it is a procedure.  I followed the documentation and I am not sure why it is not working.

Thanks.

Michael

 

 

0 Kudos
8 Replies
Steve_Lionel
Honored Contributor III
436 Views

You have misspelled the directive. It starts:

!DEC$ ATTRIBUTES

not:

!Dec$ATTRIBUTE

The lowercase is fine, but the keyword is incorrect and there must be a space after the $. Or maybe you're just typing this from memory and your actual program has something different - that makes it quite difficult to help you.

If you still need help, please post a minimal but complete example of the DLL source and EXE source so that we can see what you are actually trying. Snippets and paraphrases are rarely useful (and most often misleading.)

0 Kudos
Steve_Lionel
Honored Contributor III
436 Views

Here's an example that works:

!dll.f90
subroutine dllsub
common /mycmn/ j
!DEC$ ATTRIBUTES DLLEXPORT :: dllsub,/mycmn/
print *, j
end subroutine dllsub
!main.f90
program test
common /mycmn/ j
!DEC$ ATTRIBUTES DLLIMPORT :: dllsub, /mycmn/
j = 42
call dllsub
end program test
D:\Projects>ifort /dll dll.f90
D:\Projects>ifort main.f90 dll.lib
D:\Projects>main.exe
          42

 

0 Kudos
gib
New Contributor II
436 Views

Hi Steve,

Out of interest, I decided to test your example with my old VS2005/IVF11.075 combination (on Windows 7).  The program builds, but when I execute it I get:

Runtime error! R6034  An application has made an attempt to load the C runtime library incorrectly.

Is this the result of changes since IVF11?

Cheers

Gib

0 Kudos
mecej4
Honored Contributor III
436 Views

Gib, did you build the DLL and the EXE in VS2005? If so check that both targets/projects are built with /Release, or both with /Debug specified. Likewise, both targets should be 32-bit or 64-bit.

If you think that the reason is something else, please provide more details.

I just built Steve's example with CVF6.6c (dated 2003), and there were no problems.

0 Kudos
Steve_Lionel
Honored Contributor III
436 Views

For that older version of Intel Fortran, add /libs:dll to the ifort command for the main program.

0 Kudos
gib
New Contributor II
436 Views

That did it, Steve.

0 Kudos
kolber__Michael
New Contributor I
436 Views

My real code does have the s at the end.  I am looking at it now.

I entered:

!DEC$ ATTRIBUTES DLLEXPORT :: GETRESERVES

 

 

0 Kudos
Steve_Lionel
Honored Contributor III
436 Views

I don't see the COMMON in that directive.

0 Kudos
Reply