2012-08-27 16 views
9

Pracuję nad algorytmem optymalizacji, aby wydajność była naprawdę ważna. Algorytm jest około 8 razy szybszy, jeśli zostanie skompilowany w VS 2010 w porównaniu do VS 2008. Googling pokazuje, że to nie moja wina (patrz np. https://stackoverflow.com/a/5560184/890355). Problem polega na tym, że ostateczny projekt musi zostać zbudowany pod VS 2008.Użycie bibliotek uruchomieniowych VC++ 2010 w projekcie VC++ 2008

Rozwiązaniem, które zmierzam, jest zbudowanie mojego algorytmu jako DLL w VS 2010, a następnie połączenie go z głównym projektem. Czy można używać bibliotek wykonawczych VC++ 2010 z moją biblioteką DLL w VS 2008? Jeśli tak, jaki jest najmniej bolesny sposób na zrobienie tego? Jakieś inne pomysły? Dzięki.

+0

C++ kompilator używany przez Visual Studio nie obsługuje C++ 0x, jeżeli jest to, o co prosicie. Oczywiście zawsze możesz użyć nowszego kompilatora, jeśli chcesz uniknąć aktualizacji do Visual Studio 2010 i/lub Visual Studio 2012. Jednym z możliwych rozwiązań jest skompilowanie samego algorytmu optymalizacji za pomocą innego kompilatora i po prostu odwołanie się do danych wyjściowych utworzonych przez ten kompilator. . –

+2

Czy biblioteki przekazują obiekty między sobą i oczekują wzajemnej alokacji?Pomieszanie bibliotek może zadziałać, ale istnieją pewne ograniczone ograniczenia (i używanie kontenerów C++ może prowadzić do złej magii): http://stackoverflow.com/questions/6531401/how-to-use-vs2010-built-dlls-in -vs2008 - krótko mówiąc, łatwiej jest zachować spójność wszystkich danych i używać tylko jednego środowiska wykonawczego C++. – birryree

+3

To może się dobrze skończyć, gdy używasz plików #include z VS2010. Co nie zadziała, VS2008 nie może ich skompilować, zwłaszcza, że ​​jesteś po ulepszeniach semantyki perf. –

Odpowiedz

1

Jeśli poprosisz o inny sposób łączenia bibliotek 2008 i 2010 w jednym pliku wykonywalnym innym niż przenoszenie części 2010 poza biblioteką DLL, to prawdopodobnie odpowiedź jest "nie ma innego prostego sposobu na osiągnięcie tego celu".

Ale jeśli nie chcesz "VC++ 2010 biblioteki uruchomieniowe ... pod VS 2008" (czyli budowanie przeciwko bibliotekom 2010 w starym IDE 2008), ale "używaj skompilowanej 2010 DLL w twoim 2008 skompilowany program ", jest to całkowicie możliwe.

Najłatwiejszym sposobem, jak to robimy w naszych projektach, jest skompilowanie (zarówno .exe, jak i DLL) przeciwko statycznie połączonym bibliotekom standardowym (MFC, jeśli go używamy), a następnie użycie LoadLibrary w .exe do załadowania DLL. W bibliotece DLL możesz wyeksportować (_declspec (dllexport)) funkcję (najlepiej wewnątrz strażników extern "C" {}) i użyć jej w rozszerzeniu .exe do GetProcAddress.

Łącza statyczne i jawne ładowanie pozwalają uniknąć wielu niespójności spowodowanych przez różne środowiska wykonawcze.

Jeśli martwisz się o ładowanie bibliotek DLL i koszty połączeń funkcjonalnych, możesz spróbować uczynić te połączenia tak rzadkimi, jak to tylko możliwe (być może poprzez przeniesienie nie tylko algorytmu, ale także więcej logiki wysokiego poziomu do biblioteki DLL). Zobacz też this issie.

I możesz zbudować cały swój kod w jednym IDE (2010) używając native multitargeting (jednak będziesz musiał zbudować główną aplikację i bibliotekę DLL oddzielnie, odpowiednio dla bibliotek v9 i v10).

3

Środowiska wykonawcze nie stanowią problemu. Nic nie stoi na przeszkodzie, aby połączyć bibliotekę DLL z środowiskiem wykonawczym VC2010, a następnie użyć tej biblioteki DLL w innych projektach. Nie ma znaczenia, czy te projekty są tworzone przy użyciu Visual C++ 2008 lub jakiegokolwiek innego języka.

Najtrudniejszą częścią jest zaprojektowanie interfejsu DLL. Po prostu eksportowanie niektórych klas C++ jest ryzykowne, ponieważ naraża użytkownika na niezgodności między różnymi kompilatorami. Myślę, że najlepszym wyjściem byłoby odsłonięcie interfejsu w stylu C lub użycie COM. Myślę, że COM jest najlepszym podejściem, ale jeśli nie jesteście zaznajomieni z technologią, to interfejs w stylu C będzie działał dobrze. (COM może być zbyt zabity, jeśli interfejs jest prosty.)

Powiązane problemy