Forzare l'inclusione di file oggetto di libreria statici che non esportano alcun simbolo (GCC/iPhone)

StackOverflow https://stackoverflow.com/questions/1450748

Domanda

Sto creando una libreria statica da utilizzare nelle applicazioni iPhone.Contiene un numero di file sorgente che non esportano simboli, tutto ciò che fanno è istanziare un'istanza statica di una classe che poi esegue del codice nel suo costruttore che registra varie cose con una classe di gestione centrale altrove.Tutto funziona bene quando il codice viene creato come parte di un'applicazione iPhone standard, ma quando è separato in una libreria statica questi file non vengono inseriti nel binario dell'applicazione finale e quindi i costruttori per le istanze della classe privata che contengono non non scappare e questo causa problemi.Ho disattivato ogni opzione di build relativa al dead stripping e così via sia per la build della libreria statica che per la build dell'applicazione finale.

Ho riscontrato questo problema sul compilatore Metrowerks qualche tempo fa, tuttavia in quel caso si verificava anche quando il codice era integrato in una singola applicazione senza librerie intermedie.La soluzione era abbastanza semplice:basta usare __declspec(force_export) sulle istanze della classe privata e tutto va bene.

Esiste un equivalente per GCC/iPhone?Sto utilizzando Xcode 3.1.4 con GCC 4.2 e ho come target iPhone OS 3.1.In alternativa, esiste un modo per indicare all'applicazione di collegarsi a ogni file oggetto nella libreria statica indipendentemente dal fatto che venga fatto riferimento esplicitamente o meno?Ho confermato l'utilizzo ar che l'intero set di file oggetto stia entrando nella libreria statica.

Grazie in anticipo.

È stato utile?

Soluzione

Penso che l'opzione che stai cercando sia -all_load:

   -all_load
       Loads all members of static archive libraries.  See man ld(1) for
       more information.

Altri suggerimenti

-all_load presenta alcuni problemi se ti capita di collegare molte librerie e/o framework (Mac OS X).In questo caso dovresti forzare solo tutti i simboli di una libreria specifica utilizzando -force_load:

g++ test.cpp -o test -force_load libtoload.a
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top