Newsgroup: it.comp.os.linux.development
Titolo: Linker che non trova i simboli in una libreria (lunghetto)...

   Salve a tutti...
Sto impazzendo con una cosa che non mi capitava piu` da anni: il linker di
gcc non mi risolve dei simboli contenuti in una libreria esterna al
progetto... 
   Libreria che, in altri progetti (tutti, come questo, gestiti con gli
autotools), funziona alla perfezione... Sono riuscito a linkare manualmente
(senza il make) usando un po' di trucchi ma andiamo per ordine...
   Quando il make arriva a linkare uno dei programmi del progetto ottengo il
seguente:
make[2]: Entering directory
`/home/rosario/earthworm/earthworm-webdrum-0.1.10/module'
/bin/sh ../libtool --tag=CXX --mode=link g++  -g -O2 -pthread   -o webdrum  
main.o event.o writersync.o plotterclear.o configuration.o threadkeeper.o 
thread.o imageinfo.o imagespec.o matchchannel.o ew_logger.o latencyconfig.o 
latency.o webdrum.o ringreader.o filewriter.o 
timer.o -learthworm_ov_util -lewovxx ../libraries/plotting/
libplotting.la
-learthworm_mt -learthworm_unix   -learthworm_ov_util -lewovxx -pthread
g++ -g -O2 -pthread -o .libs/webdrum main.o event.o writersync.o
plotterclear.o configuration.o threadkeeper.o thread.o imageinfo.o
imagespec.o matchchannel.o ew_logger.o latencyconfig.o latency.o webdrum.o
ringreader.o filewriter.o timer.o -pthread  
../libraries/plotting/.libs/libplotting.so /usr/lib/libearthworm_mt.so 
/usr/lib/libearthworm_unix.so /usr/lib/libearthworm_ov_util.so /usr/lib/libewovxx.so
webdrum.o: In function `WebDrum::heartbeat()':
/home/rosario/earthworm/earthworm-webdrum-0.1.10/module/webdrum.cpp:360:
undefined reference to `ewxx::Ring::putMessage(MSG_LOGO const*, long, char
const*)'
collect2: ld returned 1 exit status
   Il metodo in questione e` contenuto nella libreria /usr/lib/libewovxx.so,
anch'essa figlia di un progetto autocompilato... Come prima cosa ho provato
(linkando a mano) a spostare l'ordine in cui appaiono le librerie sulla
linea di comando: questa cosa, a volte, in passato mi aveva aiutato, ma
stavolta niet... Ho allora provato a linkare non la versione dinamica della
libreria, ma la versione statica e, sorpresa, e` cambiato il simbolo non
risolto:
g++ -g -O2 -pthread -o .libs/webdrum main.o event.o writersync.o
plotterclear.o configuration.o threadkeeper.o thread.o imageinfo.o 
imagespec.o matchchannel.o ew_logger.o latencyconfig.o latency.o webdrum.o 
ringreader.o filewriter.o timer.o -pthread /usr/lib/libearthworm_ov_util.so 
/usr/lib/libewovxx.a ../libraries/plotting/.libs/libplotting.so 
/usr/lib/libearthworm_mt.so /usr/lib/libearthworm_unix.so
../libraries/plotting/.libs/libplotting.so: undefined reference to
`ewxx::PacketMean::~PacketMean()'
../libraries/plotting/.libs/libplotting.so: undefined reference to
`ewxx::PacketMean::PacketMean(ewxx::Packet const&)'
Da notare che sono sempre simboli contenuti nella stessa libreria
libewovxx... Allora ho messo due volte la libreria, all'inizio ed alla
fine:
g++ -g -O2 -pthread -o .libs/webdrum main.o event.o writersync.o 
plotterclear.o configuration.o threadkeeper.o thread.o imageinfo.o 
imagespec.o matchchannel.o ew_logger.o latencyconfig.o latency.o webdrum.o 
ringreader.o filewriter.o  timer.o -pthread /usr/lib/libearthworm_ov_util.so
/usr/lib/libewovxx.a ../libraries/plotting/.libs/libplotting.so 
/usr/lib/libearthworm_mt.so /usr/lib/libearthworm_unix.so /usr/lib/libewovxx.a
Ed ha funzionato senza problemi !!!! La cosa funziona anche se sostituisco
la seconda istanza della libreria statica con quella dinamica, ma non se la
uso all'inizio !!! Tra l'altro in questo modo il metodo
ewxx::Ring::putMessage viene inserito staticamente nell'eseguibile (nm
dixit)...
*sigh* non so piu` che pesci pigliare, ho provato a fare tutte le rotazioni
possibili nell'elenco di librerie nel Makefile.am ma nisba !!!
Chi mi sa aiutare ???
Ah, sto usando debian etch, e g++ e` il seguente:
g++ -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: 
../src/configure -v
--enable-languages=c,c++,fortran,objc,obj-c++,treelang
--prefix=/usr --enable-shared --with-system-zlib
--libexecdir=/usr/lib --without-included-gettext
--enable-threads=posix --enable-nls --program-suffix=-4.1
--enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug
--enable-mpfr --with-tune=i686 --enable-checking=release i486-linux-gnu
Thread model: posix gcc version 4.1.2 20061115 (prerelease) (Debian
4.1.1-21)
-- 
                          |
\|/ ____ \|/   \ ||_|     |  Tutti mentono; ma non importa,
"@'/ ,. \`@"    \|| |     |  perche` nessuno sta a sentire.
/_| \__/ |_\ Vax Headroom |
   \__U_/                 |          Legge di Lieberman

Interfacciandosi alla mia unita' neurale, Vax Headroom disse:
[cut]
Alla fine ho risolto in un modo tanto banale quanto sconcertante:
modificando l'ordine dei sorgenti nel Makefile.am...
Ma 'sto baco del linker di gcc non era stato risolto eoni fa ???
-- 
                          |
\|/ ____ \|/   \ ||_|     |   Se un triangolo ha quattro lati,
"@'/ ,. \`@"    \|| |     |   uno non e` suo
/_| \__/ |_\ Vax Headroom |
   \__U_/                 |      da it.discussioni.folli