2011-01-17 11 views
8

Mam pewne obawy związane z kompatybilnością wokół budynku biblioteki C++ z nowoczesną wersją GCC 4.4.x/4.5.x, dzięki czemu klienci w starszej wersji, powiedzmy 3.4.x/4.1 .x. Jednym z sugerowanych rozwiązań jest skompilowanie plików obiektów i ich dystrybucja. Klienci mogą następnie połączyć za pomocą dowolnej wersji GCC i odpowiedniej ABI. Niektóre pytania:Łączenie plików obiektów zbudowanych przy użyciu różnych wersji GCC

  1. Czy to prawda?
  2. Czy powinienem statycznie łączyć, aby uniknąć problemów ze zgodnością z libstdC++?
  3. Czy to niepotrzebne (słyszałem, że gcc 3.4 jest kompatybilny z przeglądarką)?

Cheers, Graeme

Odpowiedz

6

Najbezpieczniej byłoby dać im .so i jej odpowiedni nagłówek ze stabilnym API binarnym. Aby być binarnie stabilnym, interfejs API nie powinien akceptować ani zwracać żadnych typów std::, takich jak std::string lub std::vector<>, ponieważ układ binarny typów std:: może zmieniać się z wersji na wersję.

Powinien być połączony statycznie z libstdC++ (tak, jest to możliwe), aby Twoi klienci nie musieli łączyć się z konkretną wersją libstdC++.

Powiedziawszy to, ostatnia zmiana ABI g ++ była, AFAIK, między 3.3 a 3.4. Od wersji 3.4 pliki obiektowe powinny być kompatybilne.

Możesz również spakować wszystkie swoje pliki .o do jednego .a dla wygody, tak aby po dodaniu nowego pliku .o twoi klienci nie musieli aktualizować swoich plików Makefile w celu połączenia z nowym .o.

+0

Czy wiesz, czy to samo dotyczy gcc w systemie Solaris? – Graeme

+0

Tak. Powyższe nie jest specyficzne dla systemu operacyjnego. –

Powiązane problemy