2011-06-27 10 views
12

Piszę bibliotekę, która musi zależeć od bibliotek, które nie są obecnie kompilowane z obsługą nowego standardu. Chciałbym skompilować bibliotekę, która musi polegać na tych bibliotekach ze std = C++ 0x. Czy są jakieś problemy z robieniem tego?Wszelkie problemy z miksowaniem bibliotek zi bez std = C++ 0x

+1

Nagłówki mogą być problemem, zobacz tutaj: http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch03s02.html –

Odpowiedz

11

Jeśli miksujesz biblioteki skompilowane z różnymi opcjami kompilatora, musisz upewnić się, że ABI dla typów danych w interfejsie jest takie samo. Niektóre typy danych (takie jak std::string) mają różne interfejsy i wymagania między C++ 03 i C++ 0x, więc interfejsy, które z nich korzystają, muszą być ostrożne.

Jeśli twoje interfejsy używają tylko wbudowanych typów i twoich własnych klas, a te same nie używają żadnych standardowych klas bibliotecznych, wszystko powinno być w porządku. W przeciwnym razie musisz sprawdzić konkretny podzbiór, którego używasz.

+1

Tylko używanie C w interfejsie nie jest ogólnie wystarczające. Nie działa przy łączeniu statycznym, w systemie Unix, wymaga specjalnych opcji do 'dlopen' podczas dynamicznego łączenia, a pod Windowsem wystąpił błąd w bibliotece wciągniętej przez/MD lub/MDd, co oznaczało, że zawiedzie jeśli jedna z bibliotek użyła 'std :: string' i została skompilowana z różnymi opcjami. (Słyszałem, że ten błąd został naprawiony w VC10.) –

+0

@ James: Zgadzam się ogólnie, ale ten problem został oznaczony ** gcc **. Jak rozumiem, intencją twórców bibliotek gcc jest zapewnienie, że powinieneś być w stanie używać kodu '-std = C++ 98' i' -std = C++ 0x' w tym samym programie, o ile interfejs pomiędzy tymi bitami kodu używa tylko kompatybilnych typów. na przykład w systemie Linux istnieje tylko jeden plik binarny 'libstdC++. so', używany zarówno przez kody' -std = C++ 98' oraz '-std = C++ 0x'. –

+0

Istnieje zamiar programistów i tak właśnie się dzieje. Miałem problemy z uzyskaniem 'dynamic_cast' do pracy, gdy zostało wykonane w jednym' .so', a obiekt został skonstruowany w innym. I z opcjami do 'dlopen' niezbędnymi do działania' dynamic_cast' do pracy, będziesz kończył udostępnianie niektórych innych funkcji, w tym funkcji składowych 'std :: vector', itd. Oraz rozmiaru i układu' std: : wektor 'zależy od opcji kompilatora; nie musisz nawet zmieniać wersji, aby się nie udało. –

3

Prosta odpowiedź brzmi: nie, chyba że sprzedawca jednoznacznie to gwarantuje (a nawet wtedy). Praktycznie rzecz biorąc, cały kod połączony musi korzystać z tej samej biblioteki standardowej i być kompilowany z tą samą wersją kompilatora, używając tych samych opcji. Istnieją sposoby obejścia tego problemu, przynajmniej dla dynamicznie powiązanych bibliotek, ale działają one tylko wtedy, gdy interfejs między bibliotekami jest czysty C, a użytkownik podejmuje specjalne kroki podczas łączenia (specjalne opcje z dlopen --- żadna biblioteka nie używa std::string w VC++ przed wersja 10 itd.). W przeciwnym razie szukasz kłopotów.