Posso mescolare librerie statiche e oggetti condivisi durante il collegamento?

Ho un progetto C che produce dieci eseguibili, tutti i quali mi piacerebbe essere collegati in modo statico. Il problema che sto affrontando è che uno di questi eseguibili usa una libreria di terze parti di cui è disponibile solo la versione a oggetti condivisi.

Se si passa il flag -static a gcc, ld errore si dice che non è in grado di trovare la libreria in questione (presumo che stia cercando la versione .a) e l’eseguibile non verrà creato. Idealmente, mi piacerebbe poter dire a ‘ld’ di colbind staticamente il più ansible e di eseguire il failover alla libreria di oggetti condivisa se non è ansible trovare una libreria statica.

Nell’interio ho provato qualcosa come gcc -static -lib1 -lib2 -shared -lib3rdparty foo.c -o foo.exe nella speranza che ‘ld’ sia collegato staticamente in lib1 e lib2 ma abbia solo una dipendenza run-time su lib3rdparty. Sfortunatamente, questo non ha funzionato come volevo; invece il flag -shared sovrascritto il flag -static e tutto è stato compilato come oggetti condivisi.

Sta legando staticamente un affare tutto o niente, o c’è un modo in cui posso mescolare e abbinare?

Guardando questo thread puoi vedere che può essere fatto. I ragazzi di GNU suggeriscono

 gcc foo.c -Wl,-Bstatic -lbar -lbaz -lqux -Wl,-Bdynamic -lcorge -o foo.exe