Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Linker che non trova i simboli in una libreria (lunghetto)...

2 views
Skip to first unread message

Vax Headroom

unread,
Sep 16, 2009, 10:49:13 AM9/16/09
to

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

Vax Headroom

unread,
Sep 28, 2009, 9:01:00 AM9/28/09
to
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

0 new messages