2011-12-22 3 views
11

Ho notato un problema con le app a seconda delle librerie condivise: se manchi qualche dipendenza, l'app non funzionerà al momento del caricamento anche se l'utente non ha intenzione di utilizzare la funzionalità della dipendenza.Librerie condivise opzionali

Mi piacerebbe che le mie app fossero migliori di così. Idealmente, piuttosto che distribuire fino a n diversi pacchetti, dove n = numberOfSupportedArchitectures * numberOfSupportedOS * Π (per ogni libreria condivisa) (il numero di alternative) Mi piacerebbe prendere un "errore durante il caricamento delle librerie condivise" eccezione emessa al momento del caricamento, quando la libreria che mi piacerebbe - ma non ne ho bisogno - è risultata assente, quindi continua l'esecuzione in un modo che evita semplicemente di utilizzare i collegamenti non risolti interessati. Ma ovviamente non c'è eccezione che si possa catturare. Se manca qualcosa, tutto cade prima che main() inizi anche.

Il più vicino possibile ottenere il controllo del processo di caricamento sta risolvendo tutti i collegamenti con dlopen, dlsym e così via. Così stancante. Mi aspetterei che ci sarebbe già una libreria disponibile per farlo per me?

Ho notato che questo non sarebbe un problema su una fonte di distribuzione né su Windows. Stavo per inserire pacchetti binari nei tag, ma a quanto pare non ho il rep per i tag moneta.

"sembra che la soluzione più elegante risieda nel perfezionamento del comportamento dei caricatori/linker del sistema operativo.

risposta

0

È possibile includere personalmente le librerie condivise e regolare il percorso di ricerca del linker tramite -rpath $ORIGIN.

+0

Oppure eseguire il programma tramite uno script che imposta la variabile di ambiente 'LD_LIBRARY_PATH'. – rodrigo

+0

Le alternative al caricamento della libreria non sono solo versioni differenti della cosa, avranno interfacce completamente diverse, o saranno del tutto assenti e la funzionalità che fornirebbe non si manifesterebbe nella UX. Sebbene questo possa fornire una via per la gestione delle librerie assenti; Potrei creare librerie inerte con la stessa interfaccia dei bersagli mancanti, dove, se gli obiettivi mancassero, potrebbero soddisfare la necessità del linker di collegarsi a qualcosa. Sembra sciocco però. – mako

2

Puoi dare un'occhiata a weak symbols. Tuttavia, questa non è una parte dello standard C o C++, quindi un po 'dipende dal compilatore. Ma se stai per GCC, funzionerà per te, immagino.

+0

Questo non mi richiederebbe di definire i corpi inerti per ogni simbolo nelle intestazioni delle biblioteche? – mako

+1

Non proprio. Puoi testare l'esistenza del simbolo. Se hai 'void foo();' puoi chiamarli nel modo seguente: 'if (foo) foo();' – Krizz

+0

Ah. Ma dovrò dichiararli tutti come simboli deboli? – mako