2009-10-21 10 views
18

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?

+0

no, nella mia esperienza personale non ero in grado di utilizzare la libreria generata da VC6 nel 2008. – Satbir

+2

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. –

+0

Vedere anche: http: // stackoverflow.it/questions/8439595/are-compiled-lib-files-intercambiabile-per-diverse-versioni-di-microsoft-visu – DuckMaestro

risposta

14

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.

+2

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

17

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 :))

+0

> 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

6

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.

+2

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. –

+1

@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

2

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.

Problemi correlati