2010-03-03 11 views
5

Nella programmazione in C, ho pensato che un file oggetto può essere collegato correttamente con un file .so purché il file .so offra tutti i simboli dichiarati nel file di intestazione.Il programma ha bisogno di simboli aggiuntivi dalla libreria condivisa .so eccetto quelli dichiarati nel file di intestazione?

Supponiamo di avere foo.c, bar.h e due librerie libbar.so.1 e libbar.so.2. L'implementazione di libbar.so.1 e libbar.so.2 è completamente diversa, ma penso che sia OK fintanto che entrambi offrono funzioni dichiarate in bar.h.

Ho collegato foo.o con libbar.so.1 e prodotto un file eseguibile: foo.bin. Questo eseguibile funzionava quando libbar.so.1 si trova in LD_LIBRARY_PATH. (Ovviamente un collegamento simbolico viene creato come libbar.so) Tuttavia, quando cambio il collegamento simbolico a libbar.so.2, foo.bin non può essere eseguito e si lamenta :

undefined symbol: _ZSt4cerr 

libbar.so.1 è un C++ costruita biblioteca, mentre libbar.so.2 è la libreria ac costruito. Non capisco perché foo.bin abbia bisogno di quei simboli relativi al C++ solo significativi nello stesso libbar.so.1, dato che foo.bin è costruito su puro codice c foo.c.

risposta

3

_ZSt4cerr è ovviamente un nome C++ storpiato. Potresti dover controllare se stai usando il compilatore giusto (gcc/g ++, so che sembra stupido, ma mi è capitato di imbattermi in tale confusione;)), e se ci sono dei macro nel file bar.h che potrebbero avere cerr di riferimento

+0

Grazie! È una mancata corrispondenza del compilatore. – solotim

+0

Modificato su un'altra domanda: http://stackoverflow.com/questions/2371073/how-to-write-c-so-library-to-subsitute-existing-c-so-library – solotim

2

È necessario demangolare il nome C++ prima di effettuare la ricerca. Per gcc v'è un programma di utilità C++ filt:

$ c++filt 
_ZSt4cerr 
std::cerr 

E 'proprio flusso di file standard error.

0

Probabilmente hai semplicemente dimenticato di collegare l'intero programma con la libreria standard C++.

0

L'affermazione nella domanda è semplicemente sbagliata. Tu dici "il file di intestazione". Non esiste una cosa come 'il file di intestazione (uno e solo).' Se intendi "il file di intestazione che dichiara una certa classe C++", beh, quella classe potrebbe ereditare da altre classi. O potrebbe usare eccezioni. O RTTI. In tal caso, per impostazione predefinita, il file .so contenente il codice che lo accompagna conterrà "simboli non definiti pendenti". Per impostazione predefinita, l'aspettativa è che il programma "principale" sia in C++ e che si colleghi al runtime di C++.

È possibile creare un file .so autonomo, ma è necessario eseguire ulteriori operazioni per crearlo. Potrebbe essere necessario utilizzare -Bsymbolic o specificare alcune librerie -l quando lo si collega o entrambi. Questa zona non è ben documentata e in genere richiede un po 'di archeologia.

+0

In c programmazione I 'include' intestazioni da qualunque libreria compilata (non link). Intendo questo 'file di intestazione'. Non sono ancora abbastanza sicuro del significato di "niente di simile al file di intestazione", potresti spiegarlo di più? (meglio in gergo C) Grazie! – solotim

Problemi correlati