Sto creando una libreria C++ open source utilizzando Visual Studio 2005. Vorrei fornire librerie precostruite insieme al codice sorgente. Queste librerie, create con VS2005, funzioneranno anche con le versioni più recenti di Visual Studio (esp VS Express Edition 2008)? O devo fornire librerie separate per versione VS?Le librerie C++ create con versioni diverse di Visual Studio sono compatibili tra loro?
risposta
Se si distribuiscono librerie statiche, è possibile distribuire librerie indipendenti dalla versione, a seconda esattamente di ciò che si sta facendo. Se stai solo effettuando chiamate al sistema operativo, potresti essere OK. C funzioni RTL, forse. Ma se si usano funzioni, classi o modelli di libreria standard C++, probabilmente no.
Se si distribuiscono le DLL, sono necessarie librerie separate per ciascuna versione VS. A volte hai anche bisogno di librerie separate per vari livelli di service pack. Come menzionato da VolkerK, gli utenti della tua libreria dovranno utilizzare le impostazioni compatibili del compilatore e del linker. E anche se fai tutto bene, gli utenti potrebbero aver bisogno di collegarsi con altre librerie che sono in qualche modo incompatibili con le tue.
A causa di questi problemi, invece di dedicare del tempo a cercare di costruire tutte queste librerie per i tuoi utenti, mi piacerebbe passare il tempo a renderle il più semplici possibile da costruire, in modo che gli utenti possano costruirle da sole con il minimo polverone.
E anche le impostazioni del progetto/i flag del compilatore possono causare codice binario incompatibile all'interno della stessa versione del compilatore, ad es./Zc: wchar_t (che era attivo per impostazione predefinita era una modifica in corso in VS2005) – VolkerK
Normalmente no. Le librerie create con gli strumenti VS sono collegate nel "Microsoft C Runtime" (chiamato MSVCRT seguito da un numero di versione) che fornisce funzioni di libreria standard C e C++ e se si tenta di eseguire un programma che richiede due versioni diverse di questo runtime, gli errori si verificheranno Oltre a questo, diverse versioni del compilatore sfornano un codice compilato diverso e il codice di una versione del compilatore spesso non è compatibile con un altro a parte nei casi più banali (e se hanno sfornato lo stesso codice allora non ci sarebbe non ha senso avere versioni diverse :))
> se si tenta di eseguire un programma che richiede due diverse versioni di questo runtime, si verificheranno errori. Funziona per noi, una delle nostre librerie esterne utilizza MSVCRT vecchio * .dll – KindDragon
Generalmente non è possibile collegarsi a librerie compilate con compilatori diversi, versioni diverse dello stesso compilatore e persino impostazioni diverse della stessa versione del compilatore e ottenere un'applicazione funzionante. (Anche se potrebbe funzionare per sottoinsiemi specifici della lingua e della libreria std.) Non esiste un'interfaccia binaria standard per C++, nemmeno una per una piattaforma comune come in C.
Per raggiungere questo, è necessario avvolgi la tua libreria in un'API C o dovrai spedire un binario per ogni compilatore, versione del compilatore e impostazione del compilatore che vuoi supportare.
GCC definisce un ABI standard utilizzato da tutte le versioni di GCC. Il compilatore di Intel utilizza lo stesso ABI, quindi le librerie compilate da Intel possono essere utilizzate da gcc. Tuttavia, MSVCRT e glibc devono essere uguali tra la libreria e l'applicazione, come menzionato da workmad3. –
@Caspin: Sì, ma anche questo fallisce se non entrambi i lati dell'ABI utilizzano esattamente la stessa versione della lib std e di ogni altra libreria i cui tipi vogliono passare attraverso il limite. Questo è un biglietto per una miriade di errori di debug molto difficili che potrebbero apparire solo in alcune circostanze, molto rare. BTDT. – sbi
Se il progetto di libreria è una libreria statica, quindi, dovrai fornire una build per ogni versione di Visual Studio in cui desideri che i tuoi utenti siano presenti. Nell'esempio che hai fornito, equivale a fornire sia un VS2005 e una libreria VS2008.
Se il progetto di libreria è una libreria dinamica, quindi, si eludono un po 'i problemi, ma ciò significa che gli utenti dovranno assicurarsi di utilizzare il "Microsoft C Runtime" compatibile con l'ambiente di costruzione. È possibile eliminare tali criteri se si collega staticamente "Runtime Microsoft C" alla libreria dinamica.
- 1. Come identificare se due diverse versioni di gcc sono compatibili?
- 2. I messaggi protobuf sono compatibili con le versioni di protobuf
- 3. Gli script CPython, IronPython e Jython sono compatibili tra loro?
- 4. I pacchetti R compilati sono compatibili con le versioni precedenti?
- 5. Le funzioni makecontext()/swapcontext() sono compatibili con C++
- 6. Visual Studio: DLL diverse per configurazioni
- 7. Quali sono le funzionalità più abusate in Visual Studio/C#?
- 8. Come faccio a potenziare con Visual Studio 2008 quando ho installato più versioni di Visual Studio?
- 9. Le librerie c statiche sono state create con un compilatore compatibile con un altro?
- 10. Migrazioni di EF compatibili con le versioni precedenti
- 11. Come utilizzare le librerie statiche OpenCV 2.4 con Visual Studio?
- 12. Diverse versioni di Netty e i loro scopi
- 13. Ultime versioni compatibili di Nutch e Solr
- 14. Passaggio tra diverse versioni JDK in Windows
- 15. File PDB con librerie in Visual Studio 10
- 16. Errori di collegamento di Visual Studio 2012 con librerie statiche
- 17. Comportamento diverso della memoria non allocata tra le versioni di Visual Studio
- 18. Python 2 e 3 sono compatibili con le versioni precedenti del bytecode (pyo & pyc)?
- 19. È possibile fare riferimento a diverse versioni del pacchetto NuGet in una soluzione di Visual Studio?
- 20. Le immagini PNG sono compatibili con i browser?
- 21. Bootstrap 3 e Boostrap 4 - versioni alfa attualmente compatibili con le versioni precedenti?
- 22. Come si uniscono due diverse soluzioni di Visual Studio?
- 23. Utilizzo di diverse versioni/diramazioni della stessa soluzione di Visual Studio 2005
- 24. Usa icone diverse con versioni di Android SDK diverse
- 25. Come si sincronizzano le versioni tra i progetti di Visual C#?
- 26. collegamento per potenziare con visual studio 2013
- 27. Debug di versioni di Visual Studio da Eclipse
- 28. Quanto sono diverse le semantiche tra Python e JavaScript?
- 29. Sviluppo di componenti aggiuntivi di Visual Studio per più versioni di Visual Studio
- 30. Quali sono le conseguenze dell'aggiunta di riferimenti al progetto C++ in Visual Studio?
no, nella mia esperienza personale non ero in grado di utilizzare la libreria generata da VC6 nel 2008. – Satbir
Hai considerato di fornire DLL invece di librerie statiche? Supponendo che non si stiano facendo operazioni "pericolose" (come l'allocazione della memoria nel codice client con la deallocazione corrispondente nella libreria), i client potrebbero semplicemente caricare la libreria indipendentemente dal compilatore con cui è stata creata o dalle librerie con cui è stata collegata. –
Vedere anche: http: // stackoverflow.it/questions/8439595/are-compiled-lib-files-intercambiabile-per-diverse-versioni-di-microsoft-visu – DuckMaestro