Supponiamo che io stia scrivendo una libreria C ++ che intendo distribuire in forma binaria, con interfacce da altri linguaggi (ad esempio Python). L'approccio 'facile' di appena compilazione della biblioteca e distribuire il DLL o quadro non funziona bene .
Per farlo funzionare è necessario compilare la libreria con ogni compilatore supportato e ogni opzione del compilatore supportato e cose brutte possono accadere se non lo fai.
Il problema è che l'ABI di C ++ in generale non è stabile e l'ABI di STL è decisamente non stabile. Una sorta di soluzione è di attenersi al "semplice" C ++ nella tua API pubblica - classi semplici con tipi di base. Il problema è che non usi i buoni tipi di STL come std::string
e 'std :: vector e finisci per reimplementarli.
Quindi mi chiedo se c'è una soluzione migliore usando una libreria Interface Definition Language (IDL). Ce ne sono molti per i protocolli di rete, come Thrift, Protobuf, gRPC, CapnProto, ecc. Ce n'è uno per le librerie?
La soluzione ideale prenderebbe quindi questo file IDL, genererà un wrapper C- > C ++ attorno alla libreria C ++, così che il suo ABI sia ora C ABI. Potrebbe quindi generare anche wrapper open source attorno alla libreria C per qualsiasi lingua tu voglia (incluso C ++).
So che è una specie di folle per avvolgere C ++ con un'API C e quindi avvolgerlo con un'API C ++. Ma non riesco a vedere un modo migliore.
Esiste? È pazzo? C'è un modo migliore?