Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
Announcements
Welcome to the Intel Community. If you get an answer you like, please mark it as an Accepted Solution to help others. Thank you!
26734 Discussions

building a dll and an exe linking to it : fatal error LNK1107: invalid or corrupt file: cannot read at 0x2F0 or cannot run exe

pascal_M_
Beginner
387 Views

I followed and adapted your links :

Coding Requirements for Sharing Procedures in DLLs

Building Dynamic-Link Libraries

and

Building Executables that Use DLLs

with the following codes :

The dll code :

function mysum(x,y) result(z)
    !DEC$ ATTRIBUTES DLLEXPORT :: mysum
    INTEGER x, y
    z = x+y
    end function mysum

function myprod(x,y) result(z)
    !DEC$ ATTRIBUTES DLLEXPORT :: myprod
    INTEGER x, y
    z = x*y
    end function myprod

in dll.F90 and the client code :

program CallingTheDLL
    !DEC$ ATTRIBUTES DLLIMPORT:: mysum
    !DEC$ ATTRIBUTES DLLIMPORT:: myprod
    integer i, j

    integer resS
    integer resP

    print*,"enter two integers"
    read (*,*) i,j
    resS = mysum(i, j)

    resP = myprod(i, j)

    print*,"Sum of ",i," and ",j," is = ",resS
    print*,"Product of ",i," and ",j," is = ",resP
    
    read(*,*)
end program CallingTheDLL

in client.F90.

The structure in the folder is :

I have a folder DLL_EXAMPLE containin two folders :

  • DLL that contains dll.F90
  • CLIENT that contains client.F90

In the folder DLL I run :

ifort /align:commons /dll dll.F90

which gives to me the output :

-out:dll.dll
-dll
-implib:dll.lib
dll.obj
   Creating library dll.lib and object dll.exp

then in the CLIENT I run :

ifort /align:commons /dll client.exe .\..\DLL\dll.obj /link .\..\DLL\dll.dll

which gives to me the outup :

-out:client.dll
-dll
-implib:client.lib
.\..\DLL\dll.dll
client.exe
.\..\DLL\dll.obj
.\..\DLL\dll.dll : fatal error LNK1107: invalid or corrupt file: cannot read at 0x2F0

Remark : if I run

ifort -o client.exe /dll .\..\DLL\dll.obj /link .\..\DLL\dll.lib

instead I don't have an error, and have this output :

-out:client.exe
-dll
-implib:client.lib
.\..\DLL\dll.lib
.\..\DLL\dll.obj
   Creating library client.lib and object client.exp

but when I double click the exe I have a windows 10 pop up "This app can't run on your PC" and if I try to run it from the command line, I have :

C:\WORK\CODING\MY\SHIT\FORTRAN\TOYING\DLL_EXAMPLE>.\CLIENT\client.exe
Access is denied.

Adding `/align:commons` or not doesn't change anything.

What did I do wrong and how to correct ?

0 Kudos
1 Reply
pascal_M_
Beginner
387 Views

Ok, this command did the job :

ifort client.F90 ..\DLL\dll.lib

And I need to have `dll.dll` and `dll.lib` in the same folder (CLIENT) as `client.exe` for the latter to run properly.

Reply