On 2010-01-21 18:27, Mark Moll wrote:
On Jan 21, 2010, at 10:22 AM, Jed Brown wrote:

On Thu, 21 Jan 2010 09:17:22 -0600, Mark Moll <mm...@cs.rice.edu> wrote:
You *can* use the Fortran BLAS/LAPACK libraries with C/C++ code.
Yes, this is actually very common, but check_fortran_function_exists
works by trying to link an actual Fortran program.  When calling from C,
you have to know how Fortran names are mangled which means testing a
number of common choices.  Nobody put this logic into these Find
modules, but it would be nice because many (most?) users of BLAS/Lapack
need to call it from both Fortran and C so they need to know how the
symbols are mangled.  CBLAS/CLapack are entirely different beasts, but I
know of far more C projects that call the Fortran versions directly than
use the C bindings.


Wouldn’t it be possible to use “nm” to detect the Fortran name mangling? For 
example:

On OS X, default LAPACK library:
nm /usr/lib/liblapack.dylib | grep cheev$ | awk '{print $3}’
_cheev

On Linux, using MKL:
nm /opt/intel/Compiler/11.1/056/mkl/lib/em64t/libmkl_intel_lp64.a | grep cheev$ 
| awk '{print $3}'
cheev

(Of course the “grep” and “awk” commands can be replaced with some cmake string 
commands, if you want to make it a bit more portable.)


This would indeed not work on systems that do not provide an nm-like
utility, but there is an system-independent way to do this:

Use a set of small C programs that will call a LAPACK routine with any
of the naming conventions:

int main() {
    _cheev( ... );
}

void stdcall__ CHEEV( ... );
int main() {
    CHEEV( ... );
}

etc.

Whichever of the programs can be successively linked (no unresolved
symbols) is the indication of the used name mangling scheme.

Caveats:
- Some Fortran compilers add two underscores when the name of the
  routine contains at least one underscore. So that variation must
  be tested too.
- String arguments pose an extra complication - the string length is
  usually added as a separate argument, but it may come at the end
  OR right after the string argument. This is not detectable by
  the above method.

Regards,

Arjen
_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to