2013-02-11 17 views
8

Sto distribuendo una libreria condivisa (C++) e un modulo python che utilizza questa libreria. Costruisco una versione modificata di Bullet Physics Library (come sottoprogetto CMake). Io uso solo le classi e le funzioni Bullet in un unico file - bullet_interface.cpp - e tutte le cose Bullet sono nascoste all'interno di "namespace {...}".Collisioni nome libreria condivisa

Il problema è che alcune altre librerie richiedono Bullet come dipendenza di sistema e collegamento alla versione di sistema di Bullet. Infatti, una delle dipendenze della mia libreria (libopenrave) esporta i simboli di Bullet. (più specificamente, a volte carica dinamicamente un plugin che esporta simboli Bullet).

Mi chiedo se esiste un modo per creare la mia libreria in modo che bullet_interface.cpp utilizzi le giuste funzioni di Bullet, ma la mia libreria non rende visibili i simboli di Bullet. Non riesco a utilizzare il bullet di sistema perché ho dovuto apportare modifiche al codice sorgente. Una soluzione hacky sarebbe quella di rinominare tutte le funzioni e le classi di Bullet usando una ricerca e una sostituzione (quasi tutte contengono la stringa "bt"). C'è un modo migliore?

+1

La soluzione ovvia è ottenere le correzioni nella libreria principale 'Bullet' e utilizzare THAT come libreria di sistema. –

+0

Puoi semplicemente assicurarti che la tua versione modificata sia caricata per prima e soddisfi tutte le dipendenze nelle altre librerie, quindi non hanno bisogno del sistema? –

+1

Quindi libopenrave esporta simboli e collegamenti di proiettili con la libreria di proiettili, mentre il plugin usa esattamente gli stessi simboli di proiettile e viene spedito con la libreria di proiettili modificata? In tal caso, puoi provare a creare la libreria di pallini modificata come una lib di tipo statico, collegarla al tuo plug-in e assicurarti che tutti i simboli di proiettili nel tuo plugin siano nascosti. Il codice del plugin li utilizzerà, mentre non saranno esportati nella tabella dei simboli dinamici. Se i makefile di prova o gli attributi di codice impostano esplicitamente la visibilità, dovrai modificarlo, magari usando i binutils per modificare la visibilità dei simboli prima di collegare gli oggetti? –

risposta

2

Questo è un po 'un modo indiretto per realizzare quello che vuoi, ma batte un search-and-replace in bullet code.

Si può provare 'prefisso' i simboli nella biblioteca proiettile mediante l'utilità objcopy in questo modo:

objcopy --prefix-symbols=old_ bullet.a 

Questo dovrebbe lavoro con una libreria dinamica pure, ma dovrete provare. Vedi this answer per i dettagli.