2012-02-06 14 views
5

Oto sytuacja, mam bazę kodu C++, która używa najnowszego GCC (4.3.3), ale muszę połączyć ze starszą bibliotekę, która została zbudowana przy użyciu GCC 3.2. 3. Nie ma nowszej wersji biblioteki, nie mogę obejść się bez niej i jest ona zamkniętym źródłem, więc nie można jej odbudować.Mieszanie ABI ABI do kompilacji z bibliotekami starszymi

To wydaje się być problemem, ponieważ są niezgodności ABI między GCC 4.3.3 i 3.2.3, więc staram się zobaczyć, jakie są moje opcje, aby rozwiązać ten problem.

Kilka dodatkowych szczegółów:

  • mogę odbudować wszystko w moim kodzie z -fabi-version = 1, aby uzyskać poprawną wersję ABI, ale jestem uzależniony od niektórych nowszych funkcji z libstdC++ wersja 6.
  • Wszystkie zależności bibliotek C++ poza bazą kodu są open source, więc mogę je odbudować w razie potrzeby, z wyjątkiem tej jednej biblioteki.
  • Wiele zależności bibliotek C, których nie można odbudować lub które byłyby trudne do odbudowania.
  • Stara biblioteka wydaje się być zależne od jakiegoś libstdC++ Wersja 5 Cechy

ja do tej pory próbowałem:

  • Odbuduj wszystkie ++ biblioteki kodu i utrzymaniu C z -fabi-version = 1 oraz link przeciwko libstdC++ w wersji 6. To kończy się niepowodzeniem z kilkoma nieokreślonymi błędami symboli dla standardowych symboli biblioteki C++.
  • To samo co powyżej, ale dodatkowo łącze w bibliotece współużytkowanej dla libstdC++ 5, rozwiązuje problemy z łącznikiem, ale wydaje się powodować mieszanie obu wersji w środowisku wykonawczym wewnątrz biblioteki legacy, co powoduje awarię.

Przeczytałem tę stronę: http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html, która wydaje się wskazywać, że możliwe jest mieszanie wersji ABI ABI w aplikacji, aby spełnić różne zależności między bibliotekami. Wydaje się jednak, że nie działa tu dobrze, chyba że czegoś mi brakuje.

Wszelkie pomysły?

+0

Opcje linkowania '-Bsymbolic' i' --exclude-libs' powinny ci pomóc, jeśli połączysz stare libstdC++ statycznie w bibliotekę współdzieloną. –

Odpowiedz

3

Ok, twoje obejście jest:

  • napisać "C" interfejs do starej biblioteki C++, skompilować z 3.2.3 tak to będzie działać.
  • Teraz możesz używać interfejsu C w nowym kompilatorze.

Możesz napisać trochę kodu "CUP" C++ wokół biblioteki C, więc użyjesz go jako C++, ale ten kod zostanie zbudowany w nowym kompilatorze.

+1

Oczywiście ma to tę wadę, że dodaje kilka kodów kleju, ale ma tę zaletę, że pracuje z DOWOLNĄ parą kompilatorów/wersji C. – kibibu

+0

To wydaje się rozsądnym podejściem. Jeśli utworzę z niego bibliotekę współdzieloną, nadal będzie ona zależna od starszej biblioteki współdzielonej libstdC++. Czy nie będę miał tego samego problemu? Czy powinienem być statycznie łączący w starszej wersji? –

+0

Po wykonaniu kilku dodatkowych czynności, wydaje się, że właściwym rozwiązaniem jest statyczne połączenie w libstdC++ ze starszego GCC w tej bibliotece współdzielonej.Jednak, jak podejrzewam, po prostu łączenie się z tym jest niewystarczające, ponieważ faktycznie miałbyś ten sam problem, co wcześniej, z symbolami współdzielonymi przez granicę biblioteki. Myślę, że możesz wyeliminować jakąkolwiek szansę, wykonując dlopen wewnątrz aplikacji i używając RTLD_NOW | RTLD_DEEPBIND | RTLD_LOCAL. –

Powiązane problemy