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