2015-03-26 6 views
5

La mia app richiama molte librerie condivise. Alcuni sono scritti in C++ che estrae in libstdC++. Quindi, che richiama in libgcc_s.so. Altre ancora sono scritte in semplice C e collegate con -static-libgcc.È libgcc_s.so collegato sia staticamente che dinamicamente nello stesso processo ok?

Così ora ho bit di libgcc collegati in modo statico all'interno di più librerie condivise e libstdC++ carica in modo dinamico altri bit di libgcc in fase di runtime.

Q1: questa impostazione mi avrebbe dato problemi? Libgcc ha uno stato interno che renderebbe problematico questo collegamento misto o è solo funzioni integrate?

Q2: Per far funzionare la mia app su Linux precedenti, dovrei distribuire libstdC++. So e libgcc_s.so e utilizzare rpath sull'exe principale per caricarlo. È questo il modo giusto per farlo?

+0

Ho notato che la mia app che è compilata con -static-libgcc si blocca _on exit_ se carico una libreria C++ in fase di runtime (che carica libgcc_s), ma solo su Mingw-w64 a 32 bit (su Mingw-64bit e su Linux 32 e 64 esiste senza crash). – cap

risposta

1

Questa impostazione potrebbe causare problemi?

Absoulutamente no. Una libreria collegata staticamente è incorporata internamente al programma come se fosse implementata nella struttura del programma stesso.
Da Wikipedia: (il corsivo è mio)

Una libreria statica o libreria collegata in modo statico è un insieme di routine, funzioni esterne e variabili, che si risolvono in un chiamante al momento della compilazione e copiati in un'applicazione di destinazione da parte di un compilatore, linker o raccoglitore, producendo un file oggetto e un eseguibile autonomo .

Vedere this supportive idea.
Per quanto riguarda il crash nel tuo commento, è molto probabile un bug.

Does libgcc ha uno stato interno che renderebbe problematico questo collegamento misto o solo funzioni in linea?

No. Solo funzioni in linea.

Per far funzionare la mia app su Linux precedenti, dovrei distribuire libstdC++. So e libgcc_s.so e utilizzare rpath sull'exe principale per caricarlo. È questo il modo giusto per farlo?

Questa domanda è un po 'un consiglio, quindi ho intenzione di dire come lo farei. Vorrei cercare libstdC++. Così in runtime nei percorsi di ricerca di collegamento dinamico standard/predefinito (possibilmente in una variabile di ambiente o in un determinato file a seconda del sistema) e, se trovato, caricarlo. Se non trovato, caricare invece le librerie spedite. Se sai in anticipo che il sistema non ha quelle librerie dinamiche, ti consiglio invece di usare una build statica del programma.

Problemi correlati