2016-03-30 4 views
0

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.

Antwort

1

Ich fürchte, Sie sollten sich auf verlassen und die Logik selbst schreiben.

Da Ihnen erlaubt, die Sprache auszuwählen, sollten Sie Ihre kleinen Snippets von Fortran schreiben können, die nach der Funktion innerhalb des Moduls suchen.

+0

Das war, wovor ich Angst hatte. Aber, wenn jemand schon einen solchen Test schon gebacken hat, wäre das schön zu teilen. –

+1

'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'. –