SCons, um eine gemeinsam genutzte Bibliothek (.so) mit einer statischen Bibliothek (.a) zu erstellen

8

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:

erstellt werden kann %Vor%

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.

    
xavjuan 11.02.2010, 17:48
quelle

5 Antworten

10

Versuchen Sie env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME']=1 in Ihrem SConstruct zu setzen.

    
Liang Wul 02.11.2010 06:23
quelle
1

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.

    
Dave Bacher 11.02.2010 18:44
quelle
1

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:

%Vor%

Jetzt können Objekte, die über den Builder " SharedFlagChecker " erstellt wurden, in einer gemeinsam genutzten Bibliothek verknüpft werden.

    
M. A. Moshier 24.02.2013 06:31
quelle
0

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.

    
NovelX 20.06.2010 06:09
quelle
0
%Vor%

Das sollte funktionieren.

    
user280372 24.02.2010 13:56
quelle