g++ linker: statisch linken forceren als er een statische bibliotheek bestaat?

Ik heb een programma dat naar veel bibliotheken linkt. g++geeft standaard de voorkeur aan koppelingen naar gedeelde bibliotheken, zelfs als het bijbehorende archief bestaat.

Hoe kan ik deze voorkeur wijzigen om statische archieven te verkiezen boven dynamische bibliotheken, als er een statisch archief bestaat?

Opmerking, ik heb de optie -staticgebruikt, maar het probeert een statisch archief voor alle bibliotheken te vinden, wat niet is wat ik wil.


Antwoord 1, autoriteit 100%

g++ -Wl,-Bstatic -lz -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed

Zal zliben libfoolinken als statisch, en libbarals dynamisch . --as-neededzal elke ongebruikte dynamische bibliotheek verwijderen.


Antwoord 2, autoriteit 11%

Als u slechts één of twee bibliotheken statisch wilt koppelen aan de rest, inclusief systeembibliotheken, aangezien deze dynamisch zijn, is het vaak gemakkelijker om de statische bibliotheek gewoon met de volledige naam te noemen. D.w.z. in plaats van -Len -Lte gebruiken om g++ een bibliotheek te laten oplossen van wat het vindt, voeg je eenvoudig het volledige pad naar de bibliotheek toe als invoer. Gebruik de g++-opdracht hierboven om een ​​hoofdprogramma van een main.o-toepassing te koppelen aan statische libz en libfoo en dynamische libbar en libglib enz. :

   g++ main.o /usr/lib/libz.a /usr/lib/libfoo.a -lbar

Bewerken 3 augustus 17:
Ik ben zojuist dit antwoordtegengekomen dat ingaat op meer detail en biedt een alternatieve manier (-l:) om de bibliotheek rechtstreeks te specificeren.

Other episodes