Quantcast
Viewing all articles
Browse latest Browse all 3270

Cannot export Fortran procedure pointer from DLL

I am trying to export a procedure pointer but it does not show up in the DLL's exported symbols

Code for the DLL:

module dll_proc_ptr

    abstract interface
        subroutine a_callme
        end subroutine
    end interface

    procedure(a_callme), pointer :: r_callme
!DEC$ ATTRIBUTES DLLEXPORT :: r_callme
    contains

    subroutine test_call
!DEC$ ATTRIBUTES DLLEXPORT :: test_call
        if(associated(r_callme)) then
            call r_callme
        else
            print *, "r_callme not associated"
        endif
    end subroutine
end module

Code for the calling program

program test_proc_ptr
	use dll_proc_ptr

	call test_call
	r_callme => my_callme
	call test_call

	contains
		subroutine my_callme
			print *, "this is my_callme"
		end subroutine
end program

If I omit the DLLEXPORT and link the module statically it works:

C:\TEMP\x>ifort dll_proc_ptr.f90 /c
Intel(R) Visual Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 16.0.0.110 Build 20150815
Copyright (C) 1985-2015 Intel Corporation.  All rights reserved.


C:\TEMP\x>ifort test_proc_ptr.f90 dll_proc_ptr.obj
Intel(R) Visual Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 16.0.0.110 Build 20150815
Copyright (C) 1985-2015 Intel Corporation.  All rights reserved.

Microsoft (R) Incremental Linker Version 11.00.61030.0
Copyright (C) Microsoft Corporation.  All rights reserved.

-out:test_proc_ptr.exe
-subsystem:console
test_proc_ptr.obj
dll_proc_ptr.obj
   Creating library test_proc_ptr.lib and object test_proc_ptr.exp

C:\TEMP\x>test_proc_ptr
 r_callme not associated
 this is my_callme

C:\TEMP\x>

However when I compile the module as a DLL, the procedure pointer is not exported and the link of the test program fails of course:

C:\TEMP\x>ifort dll_proc_ptr.f90 /dll
Intel(R) Visual Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 16.0.0.110 Build 20150815
Copyright (C) 1985-2015 Intel Corporation.  All rights reserved.

Microsoft (R) Incremental Linker Version 11.00.61030.0
Copyright (C) Microsoft Corporation.  All rights reserved.

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

C:\TEMP\x>dumpbin -exports dll_proc_ptr.dll
Microsoft (R) COFF/PE Dumper Version 11.00.61030.0
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file dll_proc_ptr.dll

File Type: DLL

  Section contains the following exports for dll_proc_ptr.dll

    00000000 characteristics
    564D8BDC time date stamp Thu Nov 19 09:44:12 2015
        0.00 version
           1 ordinal base
           1 number of functions
           1 number of names

    ordinal hint RVA      name

          1    0 00001010 DLL_PROC_PTR_mp_TEST_CALL

  Summary

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

C:\TEMP\x>

I don't see in the documentation of the DLLEXPORT attribute that it excludes procedure pointers.

Johny


Viewing all articles
Browse latest Browse all 3270

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>