SCons Bibliotheken und sub-Bibliotheken
Habe ich eine hierarchische build-system basiert auf SCons. Ich habe einen root SConstruct, dass Anrufe in ein SConscript baut, dass eine shared library und dann in einem anderen SConscript baut eine ausführbare Datei, hängt von der gemeinsam genutzten Bibliothek.
So, hier ist meine Frage: mein Verständnis von shared libraries unter linux ist, dass, wenn Sie wollen, um die endgültige ld
link auf die ausführbare Datei wird über das shared lib, die shared lib enthalten sein, die auf die ausführbare Datei ld
Befehlszeile als Quelle zu verweisen (es sei denn, es ist in einem standard-Speicherort, in dem Fall die -l
option funktioniert).
Hier ist So etwas wie das, was meine SCons-Dateien Aussehen:
=== rootdir/SConstruct
env=DefaultEnvironment()
shared_lib = SConscript('foolib/SConscript')
env.Append( LIBS=[shared_lib] )
executable = SConscript('barexec/SConscript')
=== rootdir/foolib/SConscript
env=DefaultEnvironment()
env.Append(CPPPATH=Glob('inc'))
penv = env.Clone()
penv.Append(CPPPATH=Glob('internal/inc'))
lib = penv.SharedLibrary( 'foo', source=['foo.c', 'morefoo.c']
Return("lib")
=== rootdir/barexec/SConscript
env=DefaultEnvironment()
exe = env.Program( 'bar', source=['main.c', 'bar.c', 'rod.c'] )
Return("exe")
Also der Haken hier ist diese Linie:
env.Append( LIBS=[shared_lib] )
Wäre dies eine großartige Möglichkeit, um generierte Bibliotheken auf der Befehlszeile für alle anderen Bibliotheken, die Sie benötigen, AUßER, dass da SCons ist dabei ein zwei-pass-Lauf durch die SConscripts (ersten zu generieren, die es Abhängigkeitsbaum, dann um die Arbeit zu tun), rootdir/foolib/libfoo.so
Winde bis auf der Befehl-Linie für ALLE Produkte, SOGAR libfoo.so
selbst:
gcc -g -Wall -Werror -o libfoo.so foo.o morefoo.o libfoo.so
Also, wie ist dieser am besten mit SCons? Jetzt habe ich Zuflucht zu diesem hack:
=== rootdir/SConstruct
env=DefaultEnvironment()
shared_lib = SConscript('foolib/SConscript')
env['shared_lib'] = shared_lib
executable = SConscript('barexec/SConscript')
...
=== rootdir/barexec/SConscript
env=DefaultEnvironment()
exe = env.Program( 'bar', source=['main.c', 'bar.c', 'rod.c'] + env['shared_lib'] )
Return("exe")
Gibt es eine mehr SCons-y Weg, dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie damit die Bibliotheken gefunden werden, indem man die build.
Blick für die
LIBPATH
undRPATH
Variablen in derSCons
Dokumentation; diese sind die "Scons-y" einrichten von Suchpfaden, so dass alle generierten-l
Optionen finden Sie Bibliotheken richtig.Haben erwähnt oben, hier ist, was Sie sollte sehen
gcc
basierend auf den Aufbau von SCons (und wenn es nicht funktioniert, können Sie haben, um es manuell tun).Den
-l
option findet immer gemeinsam genutzten Bibliotheken zur Verfügung gestellt, dass Sie auch geben Sie die compiler, die Position der Bibliothek. Es gibt zwei mal diese benötigt wird: bei der Kompilierung (-L
option) und zur Laufzeit (-rpath
generierten linker-option).Den
LIBPATH
SCons-setup sollte etwas erzeugen, das aussieht wie-L/some/directory/path
für die compile-Zeit-such-Pfad.Den
RPATH
SCons setup generieren soll eine linker-option zu einbetten ein Suchpfad; z.B.-Wl,-rpath -Wl,\$ORIGIN/../lib
einbetten würde einen Pfad suchen, die sucht, die relativ zu der ausführbaren Datei, so dass ausführbare Dateien platziert inbin
Suche im parallellib
- Verzeichnis der installation.Hier ist eine bessere Art und Weise zu organisieren Sie Ihre SConsctruct/SConscript-Dateien. In der Regel mit Hierarchischen baut Sie teilen sollte in der env mit dem rest der sub-Verzeichnisse. Beachten Sie, dass ich geklont Haupt-env in der barexec-Verzeichnis, so dass die foolib wird hier nur verwendet, link, binary.
=== rootdir/SConstruct
=== rootdir/foolib/SConscript
=== rootdir/barexec/SConscript
Zusätzlich zu Brady Entscheidung, die ich verwenden statische/Globale Variablen zu speichern, Ziele, name und Pfad. Es wird mir erlauben, mehr Kontrolle über die build.
Ziele:
Anwendung:
In meinen Projekten funktioniert es einwandfrei, scons automatisch finden, hängt in der Bibliothek ohne zusätzliche Befehle. Und wenn ich will, den Namen zu ändern der library ändere ich einfach mein Projekt Klasse.