• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

g++: fftw3 statisch kompilieren

davidhigh

Newbie
Hallo allerseits,

ich arbeite unter Suse 10.3. und das Problem, dass ich C-Programme, die fftw3-Bibliotheken gebrauchen, nicht statisch kompilieren kann.
Ist auch irgendwie klar, da nirgendwo ne Datei wie libfftw3.a zu finden ist, sondern nur die dynamischen installiert sind.
Dabei habe ich alles, was mir die opensuse.org-Seite anbietet installiert.

Weiß jemand, woher man die statischen Bibliotheken bekommt ?

Wenn nicht, gibt es die Möglichkeit, einige andere Bibliotheken statisch zu kompilieren und nur die libfftw3.so dahin zu kopieren wo sie von meinem Programm benutzt werden soll ?

Gruß, David
 

oc2pus

Ultimate Guru
im meinem Paket fftw3-devel bzw fftw3-threads-devel sind die statischen Bibliotheken enthalten.

siehe hier:
http://packman.links2linux.de/package/fftw3

Achtung: es gibt verschiedene statische Bibliotheken!
 
OP
D

davidhigh

Newbie
Danke erstmal,
ich hab mir das Packet jetzt runtergeladen und installiert, und jetzt finde ich auch mehr Dateien, allerdings klappts mit dem statischen Kompilieren immer noch nicht so:
Code:
g++ program.cpp -o program -lfftw3 -static
klappt nicht. Wie machst du das denn ?

Gruß, David

EDIT: Bei genauerem Hinsehen find ich auch keine Datei mit Endung ".a" sondern nur Textdateien mit Endung ".la". Ist das normal so ?
Ich hab die fftw3-devel noch mal installiert, aber geändert hat sich nix...
 
OP
D

davidhigh

Newbie
Das Problem ist folgendes:

Ich würde das Programm gerne auf einem Rechner laufen lassen, auf dem diese Bibliotheken nicht sind. Deshalb dachte ich man muss das ganze statisch kompilieren, damit die Routinen die das Programm braucht in die ausführbare Datei aufgenommen werden.
Geht das auch anders ? (also mal abgesehen davon, dass ich auf dem neuen PC die nötigen Bibliotheken installiere - keine root-Rechte und es sind auch zu viele, um sie einzeln rüber zu kopieren).

Gruß, David
 
OP
D

davidhigh

Newbie
Hallo,
das ist schonmal gut zu wissen.

Problem ist aber nach wie vor, das die Datei libfftw3.a gar nicht installiert zu sein scheint. Bist du sicher, dass sie bei dir drauf ist ? Hast du vielleicht ne ältere Version von dem Packet ?

Gruß, David
 

oc2pus

Ultimate Guru
davidhigh schrieb:
Problem ist aber nach wie vor, das die Datei libfftw3.a gar nicht installiert zu sein scheint. Bist du sicher, dass sie bei dir drauf ist ? Hast du vielleicht ne ältere Version von dem Packet ?

nein, wieso eine ältere Version ????

rpm -ql fftw3-devel
==>
/usr/bin/fftw-wisdom
/usr/bin/fftw-wisdom-to-conf
/usr/bin/fftwf-wisdom
/usr/bin/fftwl-wisdom
/usr/include/fftw3.f
/usr/include/fftw3.h
/usr/lib/libfftw3.la
/usr/lib/libfftw3.so
/usr/lib/libfftw3f.la
/usr/lib/libfftw3f.so
/usr/lib/libfftw3l.la
/usr/lib/libfftw3l.so
/usr/lib/pkgconfig/fftw3.pc
/usr/lib/pkgconfig/fftw3f.pc
/usr/lib/pkgconfig/fftw3l.pc
/usr/share/doc/packages/fftw3-devel
...

ist doch alles da was du braucht :mrgreen:
 
OP
D

davidhigh

Newbie
Gut wenn das so ist. libfftw3.a kann ich in der Liste allerdings nicht finden.
Was muss ich denn nun eingeben, um statisch zu kompilieren ?

Gruß, David
 
Kopier doch libfftw3.so einfach mit auf das Zielsystem. Die kannst du sogar in einem Verzeichnis deiner Wahl ablegen (also z.B. der des eigentlichen Programms), musst dann nur
Code:
export LD_LIBRARY_PATH="/hier/liegt/mein/libfftw:$LD_LIBRARY_PATH";
mit angeben.
 
OP
D

davidhigh

Newbie
Danke für den Hinweis, das Problem ist nur, dass ich noch die Lapack und die gsl einbinde. Nun könnte ich natürlich auch noch diese Bibliotheken mitrüber kopieren, die fordern dann aber wieder andere Bibliotheken und am Ende könnte ich gleich alles dort installieren.

Am liebsten wär mir das gleich an Ort und Stelle statisch zu kompilieren - oc2pus meint ja, das ginge - nur wie ???

Gruß, David
 
1. Du baust ein Tarball
- Bibliotheken brauchst du nicht mitliefern, jeder holt sich die aus seiner Distributionsquelle.

2. Du baust ein RPM
- nötige Bibliotheken werden von der Distributionsquelle bezogen.

3. Du baust ein Binary
- will eigentlich keiner (weil (2))
- hauptsächlich für Engpässe (Bootstrapping von neuen Systemen) und Eigenbedarf
- kopier alle nötigen Libs (lapack und gsl brauchen nichts weiter). VMware macht das auch so, und da sinds mehr als nur drei
- und wenn's gar nicht geht, baust du dir fftw3 mit .a-Archiven. Mit all den Nachteilen (hauptsächlich z.B. Securityupdates) die das bei Distribution des Programms mit sich bringt.
 

oxe1976

Member
Hallo,

eine library die du statisch linken willst, kannst du generell mit ar erzeugen (Achtung pseudo code):

Code:
ar obj1.o obj2.o ... libarchive.a

Zum executable kannst du dann wie folgt linken:

Code:
gcc programm.o -L/path/to/library -larchive -o programm.exe
 

regexer

Advanced Hacker
oxe1976 schrieb:
Hab auch unter Linux genug .exe's rumliegen ... gibs wohl doch.
Zumindest auf meinem System gibt es kaum welche. Die heißen z.B. "ZenUpdater.exe" oder "wininst*.exe" - haben also Windows-Bezug.

Aber du kannst natürlich dein Kompilat grundsätzlich nennen, wie du willst - ist halt nur unüblich...
 
OP
D

davidhigh

Newbie
Ok, Leute
ich danke euch, dass ihr mir helfen wollt, allerdings kommt die Hilfe nicht so richtig an - ich kapiers nicht:

Also, bitte nochmal für Laien. Ich habe folgende Dateien gegeben
rpm -ql fftw3-devel
==>
/usr/bin/fftw-wisdom
/usr/bin/fftw-wisdom-to-conf
/usr/bin/fftwf-wisdom
/usr/bin/fftwl-wisdom
/usr/include/fftw3.f
/usr/include/fftw3.h
/usr/lib/libfftw3.la
/usr/lib/libfftw3.so
/usr/lib/libfftw3f.la
/usr/lib/libfftw3f.so
/usr/lib/libfftw3l.la
/usr/lib/libfftw3l.so
/usr/lib/pkgconfig/fftw3.pc
/usr/lib/pkgconfig/fftw3f.pc
/usr/lib/pkgconfig/fftw3l.pc
/usr/share/doc/packages/fftw3-devel
...

und
Code:
g++ program.cpp -o program -lgsl -lgslcblas -lm -llapack -lfftw3 -static
funktioniert nicht, weil -lfftw3 nicht gefunden wird. Dynamisch gehts aber.

Kann mir jemand erklären, was ich zu tun habe (am besten mit Beispielbefehlen), damit das ganze statisch kompiliert werden kann (damit es auf anderen Systemen läuft, die fftw3 nicht installiert haben) ? Es steht möglicherweise alles schon oben, aber wie gesagt, ich kapiers nicht.
Danke im Voraus,
Gruß, David
 
Oben