Ho una domanda relativa all'inserimento di una libreria in un'altra.Come incorporare una libreria C++ in una libreria C?
Ho un codice che è puro C e i miei utenti si affidano a questo, non vogliono dipendere dalle librerie C++. Tuttavia, è nata l'esigenza di incorporare una libreria di terze parti (ICU) nella mia. Nessuna delle funzioni ICU sarebbe stata esportata, sarebbero state utilizzate solo internamente nella mia libreria. Sfortunatamente l'ICU è una libreria C++, sebbene abbia un wrapper C. L'ICU non usa eccezioni, ma usa RTTI (classi base astratte).
La domanda è: come avrei potuto creare la mia libreria statica in modo che
- ICU è incorporato nella mia biblioteca (tutti i riferimenti alle funzioni di terapia intensiva sono risolte all'interno della mia biblioteca)
- tutti i riferimenti a libstdC++ sono inoltre deliberato e il codice necessario è incorporato nella mia libreria
- se un utente non ha nemmeno libstdC++ installato sul proprio sistema funziona perfettamente
- se un utente utilizza la mia libreria all'interno di un progetto C++ non ci sono conflitti con whateve r libstdC++ (presumibilmente il sistema libstdC++) che usa.
È possibile? Le piattaforme target sono praticamente tutto: windows (la mia libreria è dinamica) e tutte le versioni unix (linux, solaris, aix, hpux - qui la mia libreria deve essere statica).
gcc-4.5 e versioni successive ha --static-libstdC++, ma per quanto ne so è solo per la creazione di librerie o di eseguibili condivisi e non di librerie statiche.
Grazie per qualsiasi aiuto!
Questo POTREBBE non essere possibile .. Beh in "la mia esperienza" almeno. Una libreria compilata con una versione specifica di libstdC++ non sembra sempre compatibile con un'altra versione. Di solito dà errori di linker. Anche per Visual Studio. Osservo librerie come OpenCV che spedisce build diverse. VC10, VC11, VC12, ecc. (L'ho costruito ieri sera). Quello che facevo era compilare tutto fino ai loro file .o. Quindi esegui 'ar -rcs * .o' dove i file o sarebbero tutte le dipendenze come zlib, libpng, ecc. Non pensare di poterti scappare da libstd anche se ... Mi piacerebbe anche una risposta a questa domanda . – Brandon
dlopen + dlsym potrebbe essere il modo di usare l'ICU da C senza creare dipendenze in fase di compilazione. – ArtemGr
@ArtemGr: ciò andrebbe bene tranne che per una cosa: ho bisogno di distribuire icu lib perché non posso presumere che l'utente ce l'abbia. Ma poi, ovviamente, ho bisogno di compilarlo. E (diciamo che sono su linux) l'ABI C++ per il compilatore che ho sulla mia macchina di compilazione potrebbe non essere compatibile (ad es. Per la risoluzione RTTI) con l'ABI C++ che l'utente ha sulla sua macchina. Quindi, se ho dlopen + dlsym la libreria icu che ho distribuito, potrei incorrere in problemi quando comincio a correre. Ecco perché voglio risolvere e collegare tutto e creare la mia libreria in questo modo. – LaszloLadanyi