Ich versuche, SCons dazu zu bringen, eine gemeinsame Bibliothek zu erstellen. Eines der Elemente, die in .so
gehen, ist .a
static lib.
Ich habe eine Zeile wie:
%Vor%Und nachdem ich es ausgeführt habe, bekomme ich diesen Fehler:
%Vor% Ich weiß jedoch, dass eine gemeinsam genutzte Bibliothek aus dem .a
über einen Befehl wie:
Irgendwelche Ideen, um das zum Laufen zu bringen oder irgendwelche Workarounds würden sehr geschätzt werden.
Verwandte Frage: Wie bekomme ich eine zusätzliche Zeichenfolge -shared
in der LINK-Befehlszeile für den Aufruf Program()
? Wenn ich das tun könnte, denke ich, dass es meine Bedürfnisse erfüllen würde.
Dieses Problem ist nicht spezifisch für SCONs. Um eine gemeinsam genutzte Bibliothek zu erstellen, benötigen Sie Objekte, die mit positionsunabhängigem Code kompiliert werden ( -fPIC
). Am besten ist es, die gemeinsam genutzte Bibliothek aus den Quelldateien mit den richtigen Optionen zu kompilieren.
In SCons können Sie eine Liste von Zielen definieren, die zum Erstellen von sowohl libMine.a als auch libShared.so verwendet werden.
Update : Für Ihre zweite Frage: SharedLibrary Builder könnte tun, was Sie brauchen:
%Vor% Wenn nicht, setzt LINKFLAGS
die Flags, die an einen Link-Befehl übergeben werden.
Das Problem liegt in der Funktion SharedFlagChecker
(Default.py), die nur nach einem internen "shared" Flag sucht. Die SCons-Dokumentation führt zu der Annahme, dass die Unterscheidung zwischen gemeinsamen Objekten und statischen Objekten über das Suffix (% co_de%) beibehalten wird, aber nicht so. Die Lösung ist einfach. In der Datei SHOBJSUFFIX
finde die scons-local.../SCons/Default.py
und editiere:
Jetzt können Objekte, die über den Builder " SharedFlagChecker
" erstellt wurden, in einer gemeinsam genutzten Bibliothek verknüpft werden.
Ich habe das gleiche Problem unter Cygwin. Ich habe '-fPIC'-Optionen an gcc übergeben, als ich die Objekte erstellte, und folgende Warnung erhalten:
Warnung: -fPIC ignoriert für das Ziel (der gesamte Code ist positionsunabhängig)
Ich habe auch '-shared' an den Link-Befehl übergeben. Und ich habe endlich den Fehler
"***. lib ist statisch und nicht mit dem gemeinsamen Ziel kompatibel: myso.dll"
Es scheint, scons erlaubt es nicht, so direkt von obj oder lib-Dateien zu erstellen, und man kann entweder die so aus einer Liste von Quellen Dateien (mit SharedLibrary ()) oder Quelldatei + 'LIBS' Option wie Dummytaurus sagt . Ich bin neugierig darauf.
Tags und Links static static-linking portability static-libraries scons