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!

Matrix Functions

Williams__Ralph
Beginner
90 Views

I can only get this to work if the function is included in a module.  I want them in a library.

Could not figure out how to attach example files, so here is cut and paste:

      function rot1(x) result(m)
      real(8), intent(IN) :: x
      real(8), dimension(3,3) :: m
 
      m(1,1) = x
      m(1,2) = 0
      m(1,3) = 0
 
      m(2,1) = 0
      m(2,2) = x
      m(2,3) = 0
 
      m(3,1) = 0
      m(3,2) = 0
      m(3,3) = x
 
      end function rot1
 
      PROGRAM AGRAV
      
      real(8), dimension(3,3) :: T
      write(6,*) 'before call'
      T = rot1(1.D0)
      write(6,*) 'after  call'
      write(6,*) 'T =', T
      
      END
 
 
Why won't this program build?
 
------ Build started: Project: Agrav, Configuration: Release Win32 ------
Compiling with Intel(R) Visual Fortran Compiler XE 13.0.1.119 [IA-32]...
AGRAV.F
Linking...
AGRAV.obj : error LNK2019: unresolved external symbol _ROT1@4 referenced in function _MAIN__
Release/agrav.exe : fatal error LNK1120: 1 unresolved externals
 
Build log written to  "file://C:\Workspace\ast-suite\Agrav\BUILD\Agrav\Release\BuildLog.htm"
Agrav - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
0 Kudos
1 Reply
Steve_Lionel
Black Belt Retired Employee
90 Views

The function returns an array. This requires an explicit interface to be visible. When you had the function in a module, that provided the interface. There's no reason you can't put it in a module and then in a library - but the caller will need to use the module. See https://software.intel.com/en-us/blogs/2012/01/05/doctor-fortran-gets-explicit-again

Reply