2016-06-07 6 views
2

Manchmal, wenn ich ein Paket aus der Quelle erstelle, scheinen die resultierenden Binärdateien einen Verweis auf die Build-Flags zu enthalten, die ich verwende.Was bewirkt, dass eine kompilierte Bibliothek ihren Build-Befehl intern speichert?

Das Beispiel, mit dem ich arbeite, ist die Bibliothek fftw. So können Sie es herunterladen und erstellen.

FWIW, diese Zeilen benötigen ungefähr ~ 30 Sekunden, um auszuführen, also versuchen Sie es.

cd /tmp 
wget http://www.fftw.org/fftw-3.3.4.tar.gz 
tar xf fftw-3.3.4.tar.gz 
cd fftw-3.3.4 
CFLAGS="-I/foo/bar" ./configure --prefix=/tmp # We aren't going to run 'make install', 
               # so the --prefix is unimportant. 

make -j4 

Jetzt überprüfen wir die kompilierte Ausgabe. Beachten Sie, dass die alberne -I/foo/bar Flagge in der Binärdatei selbst endete!

$ strings .libs/libfftw3.a | grep gcc 
gcc -I/foo/bar 

Aus technischen Gründen nicht wert hier (im Zusammenhang mit einem Paket-Management-Tool) zu erwähnen, ich möchte, dass verhindern oder zumindest zu verstehen, warum es geschieht, und wenn es wichtig ist.

BTW: Dies scheint sowohl unter Linux als auch unter OS X sowohl für gemeinsam genutzte als auch für statische Bibliotheken zu geschehen.

+1

Keine reproduzierbaren [hier] (http://coliru.stacked-crooked.com/a/522a2aa00b1fa5d5). Bitte geben Sie eine [MCVE] an. –

+0

@ n.m. OK, ich habe bearbeitet, um ein reales Beispiel zu liefern (fftw). Sie können diese Befehle auf Ihrem eigenen Computer kopieren und einfügen, was nur etwa 30 Sekunden dauern sollte. –

+0

Studieren Sie die generierten 'Makefile'-s –

Antwort

0

Es stellt sich heraus, dass dies spezifisch für fftw war. Danke an @ n.m. um mir zu helfen, das zu sehen.

Die fftw Quellen haben eine Zeile wie die folgende. (Vereinfachen hier.)

// api/version.c 
const char fftwf_cc[] = FFTW_CC; 

Und über seine configure/make-Skripte, fftw verwendet so etwas wie den folgenden Befehl bauen (wieder drastisch hier vereinfacht).

... also kein Wunder, dass es in der Bibliothek kompiliert wird.