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?
Oczywistym rozwiązaniem jest wprowadzenie poprawek do głównej biblioteki 'Bullet' i użycie TO jako biblioteki systemowej. –
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? –
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? –