On 07/19/2010 09:37 AM, John Cary wrote: > So this is very cool. Thanks!
> Somehow it is not quite working for me. My project is entirely > C++ with C and C++ libraries All the magic I just described is for projects that mix Fortran and C++ themselves. It will not handle this case because the Fortran language is not even enabled. > it links to a system lapack and blas that reference the fortran > libraries, so my final link has the errors, > > <start of long link line> > trilinos/lib/libml.a /contrib/trilinos/lib/libamesos.a > /contrib/trilinos/lib/libifpack.a /contrib/trilinos/lib/libepetraext.a > /contrib/trilinos/lib/libgaleri.a /contrib/trilinos/lib/libtriutils.a > /contrib/trilinos/lib/libepetra.a /contrib/trilinos/lib/libteuchos.a > /contrib/lapack_cmake-3.2.1-ser/lib/liblapack.a > /contrib/lapack_cmake-3.2.1-ser/lib/libblas.a -lz > Undefined symbols: > "__gfortran_transfer_character", referenced from: > _xerbla_ in liblapack.a(xerbla.f.o) Okay, the real problem here is that the lapack and blas static archive libraries are used without listing their dependencies. In principle we do not care that their dependencies happen to be the Fortran runtime libraries. We only want to know "to use lapack, you need to link to these other libraries over here too". However, in this case we may need to be aware of Fortran anyway because the symbols in the lapack and blas libraries provide the Fortran ABI (e.g. mangling). > I do have > > ENABLE_LANGUAGE(Fortran) > INCLUDE(FortranCInterface) > > in my CMakeLists.txt, and it is finding what you say below: Good. I think you'll need this to get the mangling right so that you can invoke the Fortran functions from C anyway. FYI, this assumes that the user will build using the same Fortran compiler that was used to build lapack and blas. See below. > numbersix.cary$ grep IMPLICIT CMakeFiles/CMakeFortranCompiler.cmake > SET(CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES "gfortran") > SET(CMAKE_Fortran_IMPLICIT_LINK_DIRECTORIES > "/usr/local/lib/gcc/x86_64-apple-darwin10/4.5.0;/usr/local/lib") > > So is my problem that my project actually has no .{F,F90} files > that are compiled? Yes, this is why CMake does not list the libraries. It has no idea that the link will involve Fortran. > Can I force the addition of these libraries without referencing > them explicitly? One workaround is to list a dummy .F file just to tell CMake that Fortran will be involved at link time. I call it a workaround because we are not really giving CMake enough information to solve this problem for us. What provides the lapack and blas libraries you're using? How are we as users supposed to know that they are Fortran-built libraries and not something provided by a project like CLAPACK. How do we know what Fortran compiler was used to build them (to know what mangling it uses)? If information like this is not available through some automatically detectable means then any solution will involve manual interference. -Brad _______________________________________________ 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