Domanda

Sto cercando di creare una libreria c ++ da utilizzare su Windows / MSVC.

Il mio problema è che, per collegarmi correttamente, ho bisogno di distribuire un sacco di versioni diverse, collegate a diverse versioni dei runtime c ++ di MSVC - single e multi-thread, debug e release, diverse versioni del compilatore, varie altra sicurezza e altre opzioni.

Mi piacerebbe distribuire solo forse due, 32 bit e 64 bit.

La mia idea è di usare forse un nuovo operatore diverso (diciamo, nuovo) e allocatori personalizzati per tutti i miei tipi di STL. Quando si crea la lib, / nodefaultlib. Quindi, quando ci si collega da un progetto genitore, è necessario che questi aggiungano mynew a new e il mio allocatore stl a quello standard (o uno di loro scelta). Immagino che dovrei cancellare, e alcune altre funzioni. Naturalmente fornirò un esempio di implementazione thunking con la libreria, ma si spera che questo risparmierebbe a tutti un sacco di mal di testa.

È possibile? Qualcuno lo ha mai provato? Esistono best practice per la creazione / distribuzione di librerie su Windows / MSVC?

È stato utile?

Soluzione

Desideri un collegamento statico, come risposta generale.

Nota rapida sulla risposta di Chris (non voglio aumentare la spinta perché è per lo più buona, ma ...):

NON collegare a msvcrt.dll (quello senza versione); questa è la versione DLL specifica del sistema operativo e, se ci si collega ad essa, probabilmente l'app non funzionerà su altre versioni di Windows. Dovresti sempre collegarti a msvcrt ##. Dll, per quanto ne so. Il DDK può contenere una lib per esso, ma non collegarlo a meno che tu non sappia davvero cosa stai facendo.

Altri suggerimenti

Collegamento statico alla libreria di runtime C ++:

  1. Apri le proprietà del progetto.
  2. Vai a Proprietà di configurazione | C / C ++ | Sezione Generazione di codice.
  3. Imposta Runtime Library su Multi-thread (/ MT).

Non è necessario utilizzare un allocatore personalizzato se si utilizza C ++ e si avvolgono tutte le allocazioni intorno a std :: tr1 :: shared_ptr (dove è possibile specificare una funzione di deallocazione). Ciò garantisce che anche quando i client rilasciano l'ultimo riferimento al puntatore condiviso, è ancora il codice nella libreria (o CRT della libreria) che viene chiamato quando l'oggetto deve essere liberato.

Questo è un modo per risolvere "l'inferno del limite DLL". Spero che sia d'aiuto! : -)

Modifica: penso di aver letto male l'intento della tua domanda. Piuttosto che non voler alcuna dipendenza da un CRT perché sei preoccupato per l'inferno del limite della DLL, suppongo che tu volessi solo una versione della tua DLL che puoi installare ovunque. In tal caso, puoi collegare il tuo programma a msvcrt.dll . È disponibile su qualsiasi sistema Windows.

Non mi hai sentito questo, ma a quanto pare nel Driver Development Kit puoi trovare una sorta di libreria di importazione che consente alle versioni più recenti di Visual Studio di collegarsi a msvcrt .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top