2013-02-11 20 views
8

Rozdzielam bibliotekę współużytkowaną (C++) i moduł Pythona, który korzysta z tej biblioteki. Buduję zmodyfikowaną wersję Biblioteki Fizyki Bullet (jako podprojekt CMake). Używam tylko klas Bullet i funkcji w jednym pliku - bullet_interface.cpp - a wszystkie rzeczy Bullet są ukryte w "namespace {...}".Zderzenia nazw współużytkowanych bibliotek

Problem polega na tym, że niektóre inne biblioteki wymagają Bullet jako zależności systemowej i łącza do wersji systemu Bullet. W rzeczywistości jedna z zależności mojej biblioteki (libopenrave) eksportuje symbole Bullet. (dokładniej, czasami dynamicznie ładuje wtyczkę, która eksportuje symbole Bullet).

Zastanawiam się, czy istnieje sposób na zbudowanie mojej biblioteki, więc bullet_interface.cpp używa prawidłowych funkcji Bullet, ale wtedy moja biblioteka nie wyświetla żadnego symbolu Bullet. Nie mogę użyć puntu systemowego, ponieważ musiałem wprowadzić zmiany w kodzie źródłowym. Jednym z hackowskich rozwiązań byłoby zmiana nazwy wszystkich funkcji i klas Bullet za pomocą wyszukiwania i zamiany (prawie wszystkie zawierają ciąg "bt"). Czy istnieje lepszy sposób?

+1

Oczywistym rozwiązaniem jest wprowadzenie poprawek do głównej biblioteki 'Bullet' i użycie TO jako biblioteki systemowej. –

+0

Czy możesz po prostu upewnić się, że zmodyfikowana wersja jest załadowana jako pierwsza i spełnia wszystkie zależności w innych bibliotekach, więc nie potrzebują systemu? –

+1

Więc libopenrave eksportuje symbole punktorów i linki z biblioteką punktorów, a wtyczka używa dokładnie tych samych symboli punktorów i jest wysyłana ze zmodyfikowaną biblioteką punktorów? Jeśli tak, możesz spróbować zbudować zmodyfikowaną bibliotekę punktorów jako statyczną bibliotekę, połączyć ją z wtyczką i upewnić się, że wszystkie symbole punktów w twojej wtyczce są ukryte. Twój kod wtyczki użyje ich, a nie zostaną one wyeksportowane w tabeli symboli dynamicznych. Jeśli pliki makefile z pociskiem lub atrybuty kodu jawnie ustawiają widoczność, musisz je zhackować, może używając binutils, aby zmienić widoczność symbolu przed połączeniem obiektów? –

Odpowiedz

2

To trochę okrężna droga do osiągnięcia tego, co chcesz, ale bije w wyszukiwarce i wymianie w kodzie.

Można spróbować „poprzedzenie” symbole w bibliotece pocisku za pomocą programu narzędziowego objcopy tak:

objcopy --prefix-symbols=old_ bullet.a 

Ten powinien praca z biblioteki dynamicznej, jak dobrze, ale musisz spróbować. Szczegółowe informacje można znaleźć w sekcji this answer.

Powiązane problemy