2017-01-30 7 views
1

Ich habe ein Programm in C++ geschrieben. Linking und Runiing funktionieren, solange ich nicht die Option "-static" für g ++ verwende. Aber ich muss es von einem Antergos USB-Live Stick mit Standardeinstellungen ausführen und es gibt keine GSL. Im Handbuch von GSL empfehlen sieFehler beim Verknüpfen von GSL mit -static

$ g++ -c main.cpp 
$ g++ -static main.o -lgsl -lgslcblas -lm -lnlopt 

Aber für diesen Code erhalte ich eine Fehlermeldung:

/usr/bin/ld: cannot find -lgsl 
/usr/bin/ld: cannot find -lgslcblas 
collect2: Fehler: ld gab 1 als End-Status zurück 

ich es als this question versucht, aber es hat nicht funktioniert für mich. Als ich

$ g++ -O2 -o test main.cpp -lgsl -lgslcblas -lnlopt -lm 
$ lld test 

laufen druckt es

linux-vdso.so.1 (0x00007fffa5b95000) 
libgsl.so.19 => /usr/lib/libgsl.so.19 (0x00007f8748c9a000) 
libgslcblas.so.0 => /usr/lib/libgslcblas.so.0 (0x00007f8748a5d000) 
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f87486d5000) 
libm.so.6 => /usr/lib/libm.so.6 (0x00007f87483d1000) 
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f87481ba000) 
libc.so.6 => /usr/lib/libc.so.6 (0x00007f8747e1c000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f87490fe000) 

So habe ich versucht, einen symbolischen Link zu erstellen, aber ich habe auch "libgsl.so"

$ ls /usr/lib/libgsl 
libgslcblas.so  libgslcblas.so.0.0.0 libgsl.so.19   
libgslcblas.so.0  libgsl.so    libgsl.so.19.3.0 

Mache ich etwas dumm? Danke für deine Hilfe.

Antwort

3

Wenn Sie passieren -lgsl, standardmäßig Sie den Linker an finden und Link beantragen, der gemeinsam genutzten Bibliothek libgsl.so oder die statischen Bibliothek libgsl.a und die gemeinsame Bibliothek bevorzugen, wenn beide im gleichen Suchverzeichnis zu finden sind. Der Linker sucht zuerst in allen Verzeichnissen, die Sie mit den Optionen -L/path/to/search, in der von Ihnen angegebenen Reihenfolge angegeben haben, und danach in seinen Standardsuchverzeichnissen (/usr/lib, usw.). Ebenso für -lgslcblas.

Wenn Sie jedoch die Verknüpfungsoption -static an gcc/g++ übergeben, wird verhindert, dass mit beliebigen gemeinsam genutzten Bibliotheken verknüpft wird. Gemeinsame Bibliotheken, libgsl.so, libgslcblas.so werden ignoriert. Statische Bibliotheken libgsl.a, libgslblas.a, müssen gefunden werden, in einigen oder anderen der Suchverzeichnisse für die Verknüpfung zu erfolgreich.

Der Linker sagt:

/usr/bin/ld: cannot find -lgsl 
/usr/bin/ld: cannot find -lgslcblas 

, weil es nicht jene statischen Bibliotheken finden können - vermutlich, weil Sie haben sie nicht installiert.

Sie nicht sagen, welche Linux-Distribution Sie arbeiten, aber wenn das Paket die libgsl und libgslcblas bietet heißt, sagen wir, libgsl[suffix] dann wird es ein entsprechendes Paket libgsl-dev, libgsl-devel, oder ähnlich bezeichnet werden. Dies wird die Entwicklung Version des Pakets, für den Einsatz von Menschen, die Software entwickeln möchten, die mit libgsl oder libgslcblas verbindet. Das Entwicklungspaket benötigt das libgsl Paket als eine Abhängigkeit - so wird es die gleichen Sachen installieren - und wird zusätzlich die Bibliothek Header-Dateien und die statische Version der Bibliothek enthalten.

Sie müssen also das libgsl Entwicklungspaket für Ihre Distribution installieren. Für Ubuntu zum Beispiel ist, dass libgsl-dev:

Später

entnehme ich, dass Ihre Distribution Arch Linux, nicht trennen dev-Pakete macht. Sie müssen die statischen Bibliotheken von der Quelle erstellen. Dazu müssen Sie zumindest müssen installiert haben:

GNU Make 
GNU autotools (autoconf, automake, libtool) 
GCC (C compiler) 
texinfo 

dann ein Standard-Build zu machen:

  • Holen Sie sich das GSL Quellcode-Paket von https://savannah.gnu.org/git/?group=gsl entweder durch Klonen des git Repo oder Herunterladen eine aktuelle tar.gz Tarball und extrahieren.

  • cd in das Paketverzeichnis.

  • Lauf ./autogen.sh. Dies wird gelingen, vorausgesetzt die GNU autotools Voraussetzungen sind erfüllt.

  • Lauf ./configure --enable-maintainer-mode (wie ./autogen.sh haben Sie aufgefordert haben). Dies wird gelingen vorausgesetzt, dass die Paketabhängigkeiten erfüllt sind und Umwelt-Plausibilitätsprüfungen bestehen.

  • Lauf make

  • Wenn make abgeschlossen ist ohne Fehler - die eine Sache von Minuten dauern wird - dann, als root, laufen make install.

Wenn alles gut geht, wird dies Ihre fehlende statische Bibliotheken installieren:

/usr/local/lib/libgsl.a 
/usr/local/lib/libgslcblas.a 

Sie sollten nicht Ihre Verknüpfung Befehl für den Linker ändern müssen sie zu finden: /usr/local/lib ist ein Standard-Linker Suche Pfad.

+0

Vielen Dank für Ihre schnelle Antwort. Es stimmt, ich habe kein 'libgsl.a'. Ich habe Arch Linux, und deshalb habe ich _gsl 2.3-1_ installiert. Aber das Repository hat kein Entwicklungspaket. Können Sie mir sagen, ob [diese Seite] (https://savannah.gnu.org/git/?group=gsl) die richtige ist? –

+0

@ D.Nagel Von [diesem] (http://unix.stackexchange.com/questions/28972/why-are-there-no-dev-packages-in-arch-linux) scheint es, dass Arch Linux nicht t separate dev-Pakete und wenn statische libs nicht im Lagerpaket sind, müssen Sie sie selbst aus der Quelle erstellen. Ihr Link ist korrekt, um die Quelle entweder aus dem Git Repo oder in einem 'tar.gz' zu erhalten. Das Quellpaket ist ein GNU-Autotool-Paket. Weißt du, wie man diese baut? –

+0

Ich habe es versucht, aber nein, ich weiß es nicht. Ich habe _release-2.3_ heruntergeladen, aber es enthielt keine Datei _configure_ nur eine _configure.ac_. Wenn ich 'autoconf configure.ac' starte, erhalte ich einen Fehler. 'configure.ac:6: Fehler: möglicherweise undefined Makro: AM_INIT_AUTOMAKE' ' konfigurieren.ac: 8: Fehler: möglicherweise undefined Makro: AM_MAINTAINER_MODE' –

Verwandte Themen