2009-07-13 18 views
6

Sto lavorando con OpenCV e vorrei mettere l'intera libreria all'interno del proprio spazio dei nomi. Ho guardato in giro un bel po ', ma non ho trovato una risposta ...Puoi inserire una libreria in uno spazio dei nomi?

Puoi fare questo senza modificare il codice sorgente della libreria? Se poi come?

+0

Ho appena visto il sito Web di OpenCV. Sembra che tutte le funzioni abbiano come prefisso un "cv". Mentre gli spazi dei nomi sono una soluzione migliore, mi chiedo, stai avendo reali collisioni con i simboli? –

+0

Non sto avendo collisioni vere, è solo per mantenere le cose organizzate mentre sto facendo wrapper di alcune strutture dati openCV e vorrei metterle nello stesso spazio dei nomi. –

risposta

7

Fondamentalmente no. Si potrebbe tentare di farlo scrivendo wrapper e macro, ma è improbabile che funzioni. Se hai davvero bisogno di fare questo, un approccio migliore è quello di biforcare la libreria e apportare le necessarie aggiunte al namespace. Certo, avresti davvero bisogno di farlo per adottare questo approccio, e sospetto che tu non lo faccia.

+0

Dannazione ........ –

+0

Accettato perché era dritto al punto –

+0

E il consiglio più saggio, sicuramente? –

4

Si potrebbe in linea di principio scrivere un programma che avrebbe analizzare le tabelle simbolo di esportazione della biblioteca, e alterare i nomi dei simboli lì. Dovresti comunque cambiare le intestazioni, naturalmente.

Che ha detto che sarebbe molto più facile scrivere un semplice script per aggiungere tag namespace e ricompilare la libreria.

+8

L'ho fatto una volta per aggirare le brutte discussioni sui nomi in una libreria di terze parti. Il mio consiglio forte è: ** non **! È orribile. –

+0

Grazie Konrad dal consiglio! –

+0

oppure potresti usare solo objcopy che ha la possibilità di alterare i simboli :-P. –

2

si potrebbe fornire un file di intestazione wrapper che dichiara la stessa interfaccia all'interno di uno spazio dei nomi. Nel file sorgente del wrapper, includi le intestazioni per la libreria e chiama in quella libreria. Nessuna fonte esterna alla tua fonte deve conoscere i simboli della biblioteca. Se vuoi essere molto attento, puoi metterlo tutto in una libreria caricata dinamicamente.

era molto comune per fare questo con COM per nascondere le dipendenze linker di qualche libreria. Non riesco a capire perché non puoi farlo con C++.

3

La risposta generale è che non si può, ma c'è un paio di trucchi che si possono fare.

Per esempio, objcopy da binutils ha la possibilità di copiare un oggetto, ma mettere un prefisso ad ogni simbolo utilizzando --prefix-simboli bandiera . il prefisso delle cose è spesso lo spazio dei nomi del povero ed è un modo "ok" per evitare conflitti.

L'uso è piuttosto semplice, qualcosa di simile:

objcopy --prefix-symbols "__mylib_" object.o new_object.o 

NOTA: sì, funziona con i file .so troppo.

NOTA 2: questo interromperà completamente il caching del nome in C++, quindi provatelo solo su una libreria con un'API in stile C. Dal momento che stai parlando di aggiungere uno spazio dei nomi in cui non ce ne sono, presumo che sia così.

Problemi correlati