2016-06-07 4 views
3

Ich möchte GNU wissenschaftliche Bibliothek in Swift verwenden, insbesondere möchte ich Routinen von gsl_rng.h verwenden. So folge ich im Grunde https://github.com/apple/swift-package-manager/blob/master/Documentation/SystemModules.md (Ich verwende Linux, nicht OS X)Verknüpfen einer C-Bibliothek und ihrer unterstützenden Bibliothek in Swift (linux)

Ich schaffe das Modul als

module CGSL [system] { 
    header "/usr/include/gsl/gsl_rng.h" 
    link "gsl" 
    export * 
} 

Allerdings kann ich nicht mein Programm bauen, da ich viele Nachrichten von der Art erhalten undefined reference to 'cblas_dasum'. Und in der Tat, wie die Dokumentation für GSL heißt

gegen die Bibliothek verknüpfen Sie sowohl die Hauptbibliothek und eine unterstützende cblas Bibliothek angeben müssen, die Standard-Grund Subroutinen lineare Algebra bietet. Eine geeignete CBLAS-Implementierung wird in der Bibliothek libgslcblas.a bereitgestellt, falls Ihr System keine bereitstellt. Das folgende Beispiel zeigt, wie eine Anwendung mit der Bibliothek verknüpfen,

$ gcc -L/usr/local/lib example.o -lgsl -lgslcblas -lm 

Was soll ich sowohl -lgsl und -lgslcblas tun verbinden?

+0

https://developer.apple.com/library/ios/recipes/xcode_help-project_editor/Articles/AddingaLibrarytoaTarget.html – Alexander

Antwort

2

eine zweite link Linie für libgslcblas Hinzufügen von dem Trick:

module CGSL [system] { 
    header "/usr/include/gsl/gsl_rng.h" 
    link "gsl" 
    link "gslcblas" 
    export * 
} 

Sie auch link "m" hinzufügen müssen, obwohl ich nicht, dass auf meiner Box (Ubuntu 14.04) zu tun habe.

Ich habe in der Swift-Dokumentation keinen konkreten Hinweis dazu gefunden und musste eine fundierte Vermutung treffen, aber es hat funktioniert. Swift unter Linux ist in Arbeit und der Package Manager ist nur mit Swift 3.0-Entwicklungsschnappschüssen verfügbar. Swift 3.0 ist eine instabile, aktiv entwickelte neueste Version der Sprache. Die Tatsache, dass ein solches gemeinsames Szenario nicht gut dokumentiert ist, sollte Ihnen einen Eindruck von der Reife der Technologie geben.

Als Alternative zum Package Manager sollten Sie einen Bridging-Header verwenden, wie in einer Antwort auf diese Frage beschrieben: Compile C code and expose it to Swift under Linux.

Egal, wie Sie es tun, eine größere Herausforderung wird die GSL API von Swift aufrufen, da die API viele nicht-primitive Typen verwendet. Um dieses Problem zu umgehen, sollten Sie einen C-Wrapper mit einer vereinfachten Schnittstelle schreiben, die von Swift aus leicht aufgerufen werden kann. Der Wrapper kann dann mit einem Bridging-Header oder Systemmodulen aufgerufen werden.

Verwandte Themen