Il collegamento alla libreria corretta
-
11-10-2019 - |
Domanda
Non credo che la mia domanda qui è stato risposto già qui. Così qui è, Ho una libreria statica che io sostengo e aggiornare periodicamente. Ho anche aggiornare il numero di versione in modo corretto. Ora la mia domanda che utilizza questo link must libreria per esattamente la stessa versione della libreria e non a quelli più anziani o più recente. Una cosa che ho provato è stato quello di utilizzare macro predefinite nel file di librerie di intestazione e controllare nella mia applicazione. Ha funzionato, ma in questo modo si può garantire solo i file header corretti. C'è qualche tecnica in modo che il collegamento avrà esito negativo se è la libreria sbagliato ?? Mi auguro che la questione è un po 'chiara.
Hari
Soluzione
Non sono sicuro che ve lo consiglio, ma ...
L'intestazione potrebbe includere:
#define LIB_VERSION_SUFFIX _3_17
#define LIB_PASTER(x, y) x ## y
#define LIB_EVALUATOR(x, y) LIB_PASTER(x, y)
#define LIB_FUNCTION(x) LIB_EVALUATOR(x, LIB_VERSION_SUFFIX)
#define lib_functionA LIB_FUNCTION(lib_functionA)
extern int lib_functionA(const char *, int);
Etc.
L'utente del codice scrive in termini di nomi di funzione non decorati (lib_functionA), mentre garantisce l'intestazione che il corretto suffisso versione viene aggiunto.
Non necessariamente modificare ogni funzione; si ha bisogno per garantire che qualche funzione che sarà sempre utilizzato è ornato con il numero di versione. Se v'è una funzione di inizializzazione (lib_init()
, forse), quindi utilizzare tale. Si potrebbe fare ad una variabile; la parte difficile allora è garantire che la variabile viene fatto riferimento in ciascun programma.
Si noti che è più usuale per garantire che l'interfaccia a una biblioteca rimane invariato tra le versioni in modo che i programmi possono essere collegati con qualsiasi versione senza bisogno di compilazione.
Altri suggerimenti
Tutto ciò che serve è un simbolo unico correlato al numero di versione, ad esempio:
int version_1_1_5=0;
in biblioteca e un certo uso di esso nella domanda, ad esempio:
extern int version_1_1_5; //decl
int *p = &version_1_1_5; // use