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 toboost::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 funzionevoid 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 toboost::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 funzionevoid 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 aboost::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
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
Incolla il comando di collegamento attuale 'make' è in esecuzione. –
@ n.m. fatto sopra. È: g ++ -L/usr/local/boost/1.44.0/lib -lboost_serialization -o test-app main.o derivato.o base.o –