Betrachten Sieeine Routine in einem Fortran-Modul definiert Mit Hilfe einer Bibliothek mit AC_SEARCH_LIBS (autoconf) finden
module bingo
contains
subroutine blah()
end subroutine blah
end module bingo
in der Datei mit dem Namen bingo.f90 ein Modul haben.
Lassen Sie sagen
Jetzt eine gemeinsame Bibliothek libbingo.so von bingo.f90 gemacht, wenn Ihr Programm verwendet libbingo im configure.ac ein konnte etwas schreiben wie
AC_SEARCH_LIBS([blah],[bingo],,[AC_MSG_WARN(bingo not found)])
auf die Existenz von libbingo in den durchsuchbaren Systempfaden oder LDFLAGS env. Variable. Das Makro AC_SEARCH_LIBS erzeugt ein sehr einfaches Code-Snippet mit einem Aufruf von blah, um sicherzustellen, dass wir die richtige Bibliothek verwenden.
Das Problem ist, das funktioniert nicht für Funktionen, die sich in Fortran-Modulen befinden. Der Grund, warum es nicht funktioniert, ist, dass das Testcode-Snippet, das von AC_SEARCH_LIBS erzeugt wird, nur eine Anweisung call blah()
enthält, während der tatsächliche Name in dem Bibliotheksobjekt wahrscheinlich bis zur Unkenntlichkeit verstümmelt wird. In der Tat gibt die Ausgabe von nm Befehl an die Bibliotheksdatei angewandt etwas von der Form __bingo_MOD_blah als die eigentlichen Routine Namen (wenn bingo.f90 ver mit gfortran zusammengestellt. 5; ich weiß nicht, wie Compiler -spezifisch sind diese Namen).
Meine Lösung ist bisher, ein Unterprogramm außerhalb einer Moduldefinition künstlich hinzuzufügen, ein externes Unterprogramm, und verwenden Sie dies, um die Bibliothek zu identifizieren. Mit anderen Worten, bingo.f90 wird
module bingo
contains
subroutine blah()
end subroutine blah
end module bingo
subroutine autoconfhook()
end subroutine autoconfhook !.
Das erzeugte configure Skript korrekt libbingo finden wird, wenn der folgende Makro
AC_SEARCH_LIBS([autoconfhook],[bingo],,[AC_MSG_WARN(bingo not found)]) #.
verwendet wird, wie gesagt, das funktioniert, aber Ich würde gerne wissen, ob es einen Ansatz gibt, eine Bibliothek durch eine Routine zu identifizieren, unabhängig davon, ob sie sich in einem Modul befindet oder nicht.
Das war, wovor ich Angst hatte. Aber, wenn jemand schon einen solchen Test schon gebacken hat, wäre das schön zu teilen. –
'AX_F90_LIBRARY' auf [dem Autoconf-Archiv] (http://www.gnu.org/software/autoconf-archive/ax_f90_library.html#ax_f90_library) ist das nächste, das ich finden kann. Ich würde vorschlagen, wenn Sie keine Schneeflocke herum behalten möchten (und ich lobe Sie dafür!), Dass das beste wäre, ein neues Makro zum Archiv beizutragen, wie 'AX_F90_SEARCH_LIB'. –