Domanda

Ho una libreria A, che sviluppo. Quando lo distribuisco su una macchina, i corrispondenti libA.so e libA-X.Y.Z.so vengono inseriti in / usr / lib (X.Y.Z è il numero di versione).

Ora sviluppo una libreria B, che usa A. Quando collego B, uso il flag -lA. Quindi " ldd libB.so " mi dà:

(...)
libA-X.Y.Z.so => /usr/lib/libA-X.Y.Z.so
(...)

Il mio problema è che quando rilascio una nuova versione di A (XYZZ), devo anche rilasciare una nuova versione di B. Altrimenti, qualcuno che installa l'ultima A non sarà in grado di installare B che cercherà per la versione XYZ che non esiste.

Come posso risolvere questo problema? Come posso dire a B di cercare libA.so e non libA-X.Y.Z.so? O è sbagliato farlo? anche insicuro?

Aggiornamento 1 : la libreria A (che ho ereditato da qualcun altro) utilizza gli autotools.

Aggiornamento 2 : quando creo la libreria A, posso vedere: " -Wl, -soname -Wl, libA-0.6.1.so " . Se capisco bene ciò significa che stiamo forzando il soname a essere libA-0.6.1.so . È giusto ? Ora il mio problema è che non ho idea di come modificare questo comportamento in un progetto che utilizza autotools. Ho cercato su Google per un po 'ma non trovo informazioni utili. Devo modificare configure.in o un Makefile.am?

È stato utile?

Soluzione

Quando crei libA.so, passa l'opzione -soname al linker (se stai collegando tramite gcc, usa -Wl, -soname). Quindi, quando B viene collegato, il linker fa riferimento ad A tramite il suo soname, non tramite il suo nome file. Sul sistema di destinazione, assicurarsi di disporre di un collegamento dal soname al file reale. Vedere

http: //www.linux. org / docs / LDP / HOWTO / programma-Biblioteca-HOWTO / shared-libraries.html

Altri suggerimenti

Funziona anche in Windows come "inferno DLL" :).

Se B necessita di una versione specifica di A e si collega a libA e non a libA-X.Y.Z, la sola sostituzione di libA con una versione più recente potrebbe causare il caricamento o l'arresto anomalo di B.

Ma ovviamente puoi fare un collegamento simbolico da libA-X.Y.Z a libA-X1.Y1.Z1. Se nessuna API è cambiata e solo le implementazioni di quelle dovresti essere al sicuro.

Risposta al mio secondo aggiornamento: Nel Makefile.am di libA, ho modificato _la_LDFLAGS da -release a -avoid-version . Questo ha creato una libreria condivisa senza numero di versione e ho quindi ricompilato libB che si collegava con successo a questa libreria condivisa senza precedenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top