2013-02-27 13 views
6

Inizierò affermando che stasera mi sento un deficiente. Sto cercando di riprodurre in minima parte un problema di lavoro che ho sotto RHEL5.6, gcc 4.1.2, boost 1.44.0, con Serializzazione Boost.Simboli non risolti che collegano w/Serializzazione boost con Ubuntu 12.10

L'ambiente che sto avendo questo problema con è Ubuntu Server (con i pacchetti dev installati), gcc 4.7.2 e una build di boost 1.44.0 (contro il compilatore di sistema, i pacchetti, ecc.).

Il mio codice viene compilato in modo pulito, ma ricevo una miriade di simboli non definiti relativi a vari tipi di boost::archive. strace in esecuzione sul mio marca, lo vedo raccogliendo biblioteca boost_serialization previsto:

668 43569 stat("/usr/local/boost/1.44.0/lib/libboost_serialization.so", {st_mode=S_IFREG|0755, st_size=700481, ...}) = 0 
669 43569 open("/usr/local/boost/1.44.0/lib/libboost_serialization.so", O_RDONLY) = 8 

mio makefile è:

default: test-app 
all: test-app 

BOOST := /usr/local/boost/1.44.0 

CPPFLAGS := -fPIC -Wall -Wextra -Werror 
INCDIRS := -isystem$(BOOST)/include 
.LIBDIRS. := $(BOOST)/lib 
.LIBS. :=boost_serialization 
LIBS := $(foreach lib,$(.LIBS.),-l$(lib)) 
LIBDIRS := $(foreach dir,$(.LIBDIRS.),-L$(dir)) 
CPPFLAGS += $(INCDIRS) 

base.o : base.cpp base.hpp 
     g++ $(CPPFLAGS) --compile $< -o [email protected] -g 

derived.o : derived.cpp base.hpp derived.hpp 
     g++ $(CPPFLAGS) --compile $< -o [email protected] -g 

main.o: main.cpp derived.hpp 
     g++ $(CPPFLAGS) --compile $< -o [email protected] -g 

test-app: main.o derived.o base.o 
     g++ -o [email protected] $(LIBDIRS) $(LIBS) $^ 

clean: 
     rm -f *.o test 

A (molto) piccolo campione degli errori di linker che sto ottenendo sono come :

base.o: In funzione void boost::archive::basic_text_oprimitive<std::ostream>::save<boost::archive::class_id_reference_type>(boost::archive::class_id_reference_type const&)': /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to boost :: :: archivio archive_exception :: archive_exception (boost :: archivio :: :: archive_exception exception_code, const char *, const char *)' 012.351./usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to boost::archive::archive_exception::~archive_exception()' /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to boost :: :: archivio archive_exception :: ~ archive_exception()' base.o: In funzione void boost::archive::basic_text_oprimitive<std::ostream>::save<boost::archive::tracking_type>(boost::archive::tracking_type const&)': /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to boost :: archive :: archive_exception :: archive_exception (boost :: archive :: archive_exception :: exception_code, char const *, char const *) ' /usr/local/boost/1.44.0/include/boost/ archive/basic_text_oprimitive.hpp: 91: undefined reference to boost::archive::archive_exception::~archive_exception()' /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to boost :: :: archivio archive_exception :: ~ archive_exception()' base.o: In funzione void boost::archive::basic_text_oprimitive<std::ostream>::save<unsigned int>(unsigned int const&)': /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to boost :: :: archivio archive_exception :: archive_exception (boost :: archivio :: archive_exception :: exception_code, char const *, char const *) ' /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: riferimento undefined a boost::archive::archive_exception::~archive_exception()' /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to boost :: archive :: archive_exception :: ~ archive_exception()'

Allo stesso modo, se faccio una discarica simbolo sui .so riferimento di, vedo i simboli necessari:

objdump -t /usr/local/boost/1.44.0/ lib/libboost_serialization.so | C++ filt | grep "boost :: :: archivio archive_exception :: ~ archive_exception()" 000000000004e670 g F .text 0000000000000065
boost :: :: archivio archive_exception :: ~ archive_exception() 000000000004e6e0 g F .text 0000000000000009 virtuale thunk a boost :: :: archivio archive_exception :: ~ archive_exception() 000000000004e6f0 g F .text 0000000000000012
boost :: :: archivio archive_exception :: ~ archive_exception() 000000000004ed60 g F .text 000000000000005c
boost :: :: archivio archive_exception :: ~ archive_exception() 000000000004e710 g F.testo 0000000000000009 virtuale thunk per aumentare :: :: archivio archive_exception :: ~ archive_exception()

ho sbattere la testa contro il tavolo per un po '... sperando che qualcuno possa aiutare. Non penso che la fonte specifica sia importante, ma se richiesto, posso postarlo.

Ulteriori dettagli ambientali:

g ++ --version g ++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2 Copyright (C) 2012 Free Software Foundation, Inc. Questo è software libero ; vedere la fonte per le condizioni di copia. Non c'è garanzia; nemmeno per COMMERCIABILITÀ o IDONEITÀ PER UN PARTICOLARE SCOPO.

ld --version 
GNU ld (GNU Binutils for Ubuntu) 2.22.90.20120924 
Copyright 2012 Free Software Foundation, Inc. 
This program is free software; you may redistribute it under the terms of 
the GNU General Public License version 3 or (at your option) a later version. 
This program has absolutely no warranty. 

Inoltre, questo è su una macchina virtuale in esecuzione con Hyper-V su Windows 8, anche se, non credo che le cose qui.

Linea completa di link: g ++ -L/usr/local/boost/test-app 1.44.0/-lboost_serialization lib -o main.o derived.o base.o

+0

Proprio per isolare eventuali problemi che potrebbero essere dal set di librerie Boost da/usr/local, si potrebbe provare a puntare il Makefile per tirare il librerie e intestazioni da quelli in/usr/lib e/usr/includono invece e vediamo se è così ci compila con successo? – Tuxdude

+1

Incolla il comando di collegamento attuale 'make' è in esecuzione. –

+0

@ n.m. fatto sopra. È: g ++ -L/usr/local/boost/1.44.0/lib -lboost_serialization -o test-app main.o derivato.o base.o –

risposta

8

Ho avuto lo stesso problema, mettendo -lboost_serialization alla fine come

g ++ -L/usr/local/boost/1.44.0/-o lib test-app main.o derived.o base.o -lboost_serialization

dovrebbe risolverlo

+0

Darò uno scatto dopo, una volta tornato a casa. –

+0

Grazie, ha funzionato. Avevo provato a usare '-Wl, - start-group $ (LIBS) $^-Wl, - end-group', e il mio ordine comprensivo non dovrebbe importare all'interno di un gruppo. Quando ho fatto '-Wl, - start-group $^$ (LIBS) -Wl, - end-group', il collegamento ha funzionato. Strano. Non so perché l'ordine dovrebbe avere importanza all'interno di un gruppo. –

-1

l'oggetto binario. o non è collegato con libs.
innanzitutto verificare che in /usr/local/boost/1.44.0/lib ci siano lib file boost_serialization.
e successivamente, che lib è registrato:
sudo ldconfig -v | grep boost_serialization
in caso contrario, creare il file boost1.44.0.conf in /etc/ld.so.conf.d con radice utente. Con questa ligne
usr/local/boost/1.44.0/lib
quindi avviare questo comando
sudo ldconfig -v | grep boost_serialization

+3

Questo è sbagliato. Per favore, non farlo. Non si dovrebbe andare root e modificare le configurazioni di sistema ogni volta che si desidera collegarsi con una libreria non di sistema. –

+0

Non è necessario toccare ld.so.conf se si superano i percorsi di ricerca corretti per il linker utilizzando l'opzione -L. – Tuxdude

Problemi correlati