On Tue, 2011-05-10 at 14:42 +0200, Michael Hertling wrote: > On 05/10/2011 12:19 PM, Erlend Pedersen wrote: > > I am having problems with Fortran linking that doesn't work when > > building static libraries, only when building shared libraries. I am > > using cmake from Ubuntu 10.04 (2.8.0-5ubuntu1). > > > > I use CMake to build a project, including project-internal shared > > libraries. All executables are Fortran, but one of the internal > > libraries contain minimal sprinklings of C and C++. All works well when > > building shared libraries, but when I switch to building static > > libraries, CMake decides to try to link all Fortran executables as if > > they were C++. Unfortunately, this means that the main function is not > > properly located, and linking fails. > > > > I tried forcing Fortran linkage on libraries only (hoping this would > > propagate into the executables that link to them), using > > > > SET_TARGET_PROPERTIES(<libname> PROPERTIES LINKER_LANGUAGE Fortran) > > > > and when building the libraries, output shows that they are indeed > > treated as Fortran static libraries. But the executables (typically > > conisting of a single .f90 file, and linked to one or more of the > > internal libraries) are still treated as C++. > > > > Only when I force the LINKER_LANGUAGE by using SET_TARGET_PROPERTIES on > > both libraries and executables does things build properly. But that > > seems needlessly redundant and noisy and redundant. > > > > Is there some easier way I can convince CMake to link the executables > > correctly? Is this a bug? > > No, this isn't a bug. The behaviour you observe occurs because of > > CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES==TRUE > CMAKE_CXX_LINKER_PREFERENCE==30 > 20==CMAKE_Fortran_LINKER_PREFERENCE > > i.e. when a static library with C++ code is mixed with Fortran code, > the C++ linker is taken into account along with the Fortran linker, > and C++ will win; this does not apply to _shared_ libraries. Hence, > setting CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES to FALSE is probably > the appropriate solution in your case, i.e. Fortran code with one, > say, C++-contaminated _static_ library. Alternatively, you might > raise the Fortran linker preference above the C++ linker's one. > > 'hope that helps.
It helped. Thank you very much. -- Erlend Pedersen Holberg Research AS _______________________________________________ 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
