2012-08-27 11 views
9

Io lavoro sull'algoritmo di ottimizzazione in modo che le prestazioni siano davvero importanti. L'algoritmo è circa 8 volte più veloce quando compilato in VS 2010 rispetto a VS 2008. Googling dimostra che non è colpa mia (vedere ad esempio https://stackoverflow.com/a/5560184/890355). Il problema è che il progetto finale deve essere costruito sotto VS 2008.Utilizzare le librerie di runtime VC++ 2010 nel progetto VC++ 2008

La soluzione tendo a è di costruire il mio algoritmo come DLL in VS 2010 e poi collegarlo al progetto principale. È possibile utilizzare librerie di runtime VC++ 2010 con la mia DLL in VS 2008? Se è così, qual è il modo meno doloroso per farlo? Qualche altra idea? Grazie.

+0

Il compilatore C++ utilizzato da Visual Studio non supporta C++ 0x, se questo è quello che chiedete. Ovviamente si può sempre usare un compilatore più recente se si desidera evitare l'aggiornamento a Visual Studio 2010 e/o Visual Studio 2012. Una possibile soluzione è compilare l'algoritmo di ottimizzazione stesso utilizzando un compilatore diverso e fare semplicemente riferimento all'output creato da detto compilatore . –

+2

Le vostre librerie passano oggetti tra loro e si aspettano l'un l'altro per deallocarli?Il mixaggio della libreria potrebbe funzionare, ma ci sono alcuni avvertimenti piuttosto limitanti (e l'uso dei contenitori C++ può portare a una cattiva magia): http://stackoverflow.com/questions/6531401/how-to-use-vs2010-built-dlls-in -vs2008 - In breve, è più semplice se è possibile mantenere tutto coerente e utilizzare solo un runtime di C++. – birryree

+3

Questo può essere utile quando si utilizzano i file #include di VS2010. Il che non funzionerà, VS2008 non può compilarli, specialmente dal momento che sei in cerca di miglioramenti perfetti alla semantica della mossa. –

risposta

1

Se si chiede un altro modo per combinare le librerie 2008 e 2010 in un eseguibile diverso da quello di spostare la parte 2010 all'esterno in una DLL, la risposta è probabilmente "non esiste un altro modo semplice per raggiungere questo obiettivo".

Ma se non si desidera "librerie di runtime VC++ 2010 ... in VS 2008" (che si sta creando contro le librerie 2010 nel vecchio IDE 2008), ma "utilizzare una DLL compilata nel 2010 nel 2008 -compile programma ", è perfettamente possibile.

Il modo più semplice, come lo facciamo nei nostri progetti, è di compilare (sia .exe che DLL) contro librerie standard collegate staticamente (MFC, se lo si utilizza) e quindi utilizzare LoadLibrary nel file .exe per caricare il DLL. Nella DLL è possibile esportare (_declspec (dllexport)) una funzione (preferibilmente all'interno delle protezioni extern "C" {}) e utilizzarla nel file .exe tramite GetProcAddress.

Il collegamento statico e il caricamento esplicito consentono di evitare numerosi bug di incoerenza causati da diversi runtime.

Se si è preoccupati del caricamento delle DLL e dei costi di chiamata delle funzioni, è possibile provare a rendere queste chiamate il più rare possibile (magari spostando non solo l'algoritmo, ma anche alcune altre logiche di alto livello nella DLL). Vedi anche this issie.

E è possibile creare tutto il codice in un IDE (2010) utilizzando native multitargeting (tuttavia sarà comunque necessario creare l'app principale e la DLL separatamente rispetto alle librerie v9 e v10 rispettivamente).

3

I runtime non sono un problema. Niente ti impedisce di collegare la tua DLL al runtime VC2010 e quindi di utilizzare quella DLL in altri progetti. Non importa se questi progetti vengono creati utilizzando Visual C++ 2008 o qualsiasi altra lingua.

La parte difficile è la progettazione dell'interfaccia DLL. Esportare semplicemente alcune classi C++ è rischioso poiché espone l'utente a incompatibilità tra i diversi compilatori. Penso che la soluzione migliore sarebbe quella di esporre un'interfaccia in stile C o utilizzare COM. Penso che COM sia l'approccio migliore, ma se non conosci la tecnologia, allora un'interfaccia in stile C funzionerà correttamente. (COM potrebbe anche essere over-kill se l'interfaccia è semplice.)

Problemi correlati