Sto compilando librerie Linux (per Android, usando NDK's g ++, ma scommetto che la mia domanda ha senso per qualsiasi sistema Linux). Quando consegna queste librerie ai partner, ho bisogno di contrassegnarle con un numero di versione. Devo anche essere in grado di accedere al numero di versione programmaticamente (per visualizzarlo in una finestra di dialogo "Informazioni" o una funzione GetVersion
per esempio).Modifica libreria condivisa Linux (.so file) dopo la compilazione
Prima di compilare le librerie con un flag non invertito (versione 0.0
) e ho bisogno di cambiare questa versione in una reale quando ho finito di testare prima di inviarlo al partner. So che sarebbe più semplice modificare il sorgente e ricompilare, ma non vogliamo farlo (perché dovremmo testare di nuovo tutto se ricompiliamo il codice, pensiamo che sarebbe meno incline agli errori, vedere i commenti a questo post e infine perché il nostro ambiente di sviluppo funziona in questo modo: eseguiamo questo processo per i binari di Windows: impostiamo una stringa di versione 0.0
resources (.rc) e in seguito la modificheremo usando verpatch ... vorremmo lavorare con lo stesso tipo di processo durante la spedizione dei binari di Linux).
Quale sarebbe la migliore strategia qui? Per riassumere, i requisiti sono:
- binari compilare con versione "unset" (
0.0
o qualsiasi altra cosa) - in grado di modificare questa versione "unset" per uno specifico senza dover ricompilare il binario (idealmente, eseguire un terzo comando dello strumento del partito, come facciamo con verpatch sotto Windows)
- in grado di avere il codice della libreria recuperare è informazioni sulla versione in fase di esecuzione
Se la vostra risposta è "rinominare il .so", t gallina si prega di fornire una soluzione per 3 .: come recuperare il nome della versione (cioè il nome del file) in fase di esecuzione.
Stavo pensando ad alcune soluzioni ma non ho idea se potessero lavorare e come ottenerle.
- avere una variabile di versione (uno
string
o 3int
) nel codice e hanno un modo per cambiarlo nel file binario in seguito? Usando un binario sed ...? - Avere una variabile di versione all'interno di una risorsa e avere un modo per modificarla in un file binario in un secondo momento? (come facciamo per win32/win64)
- Utilizzare un campo del .so (come SONAME) dedicato a questo e avere uno strumento che consente di cambiarlo ... e renderlo accessibile dal codice C++.
- Rinominare la modifica + SONAME (non ha trovato il modo in cui è possibile ottenerlo) ... e trovare un modo per recuperarlo dal codice C++.
- ...
Nota che usiamo QtCreator per compilare i file Android .so, ma non possono fare affidamento su Qt. Quindi utilizzare le risorse Qt non è una soluzione ideale.
Si teme che la ricompilazione dello stesso codice esatto con una stringa di versione scambiata possa rompere le cose e necessiti di nuovi test, ma sono perfettamente soddisfacenti con una soluzione che comporta l'hacking di uno script che applica patch alla stringa modificata nel binario? Interessante. – Phillip
Le tue osservazioni hanno perfettamente senso. In realtà lo facevamo in quel modo: cambia il numero di versione (a 3.2 per esempio) nel codice e ricompilalo. Siamo una piccola struttura, persone che fanno sia lo sviluppo che l'integrazione ... quindi, lo sviluppatore che fa questo spesso dimentica di reimpostare la stringa della versione su 0.0 e poi in seguito si ottengono i binari di sviluppo contrassegnati 3.2 quando non sono sicuramente la versione 3.2 ... quella è perché contrassegnare i binari una volta che la compilazione dei post sembrava essere più sicura per noi (e questo è il modo in cui finiamo per lavorare sotto Windows). – jpo38
Il mio commento si applica ancora :-) Perché non risolvi il problema alla radice e modifica l'ambiente di costruzione per riportare il numero di versione a 0.0 per qualsiasi build di debug? Il modo più semplice per farlo sarebbe utilizzare una definizione del preprocessore per il numero di versione. La cosa buona di questa soluzione è che può essere facilmente adottato per includere per es. ID di revisione nelle stringhe di versione di build di debug. – Phillip