2013-02-27 17 views
6

Bu gece bir moron gibi hissettiğimi söyleyerek başlayacağım. Kuvvetlendirme Serileştirme ile RHEL5.6, gcc 4.1.2, 1.44.0 desteği altında sahip olduğum bir iş sorununu minimum düzeyde yeniden üretmeye çalışıyorum.Ubuntu 12/Boost Serileştirmesini bağlayan Çözülmemiş Semboller 12.10

çevre ben ile bu sorunu yaşıyorum, gcc 4.7.2 ve boost 1.44.0 bir yapı (sistem derleyici karşı, paketler, vs) (dev yüklü paketleri ile) Ubuntu Server.

Kodum düzgün bir şekilde derleniyor, ancak çeşitli boost::archive türleriyle ilgili çok sayıda tanımsız sembol alıyorum.

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 

Benim Makefile geçerli:: Ben alıyorum bağlayıcı hataları

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 $@ -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 (çok) küçük bir örnek gibi benim hissetmez strace Koşu, ben beklenen boost_serialization kütüphanesi toplayıp bkz :

base.o: fonksiyonda 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 :: arşiv :: archive_exception :: archive_exception (artırmak :: arşiv :: archive_exception :: exception_code, karakter const *, karakter const *)' /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: tanımsız başvuru için boost::archive::archive_exception::~archive_exception()' /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to boost :: arşivi :: archive_exception :: ~ archive_exception()' base.o: olarak işlev 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 :: arşiv :: arşiv_exception :: exception_code, char const *, char const *) ' /usr/local/boost/1.44.0/include/boost/ arşiv/basic_text_oprimitive.hpp: 91: tanımsız başvuru için boost::archive::archive_exception::~archive_exception()' /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to boost :: arşivi :: archive_exception :: ~ archive_exception()' base.o: işlevi 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 :: arşivi :: archive_exception :: archive_exception (boost :: arşiv :: archive_exception :: exception_code, char const *, char const *) ' /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: tanımsız başvuru için 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 :: ~

objdump -t /usr/local/boost/1.44.0/: Ben başvurulan .bu yıllardan bir sembol dökümü yaparsanız

Aynı şekilde archive_exception()', ben gerekli sembolleri bakın lib/libboost_serialization.so | C++ filtreler | grep "artırmak :: arşiv :: archive_exception :: ~ archive_exception()" 000000000004e670 gr F .text 0000000000000065
boost :: arşiv :: archive_exception :: ~ archive_exception() için 000000000004e6e0 gr F .text 0000000000000009 sanal thunk artırmak :: arşivi :: archive_exception :: ~ archive_exception() 000000000004e6f0 g kadar F .text 0000000000000012
boost :: arşivi :: archive_exception :: ~ archive_exception() 000000000004ed60 g kadar F .text 000000000000005c
boost :: arşivi :: archive_exception :: ~ archive_exception() 000000000004e710 g F.Metin 0000000000000009 sanal thunk artırmak için :: arşiv :: archive_exception :: ~ archive_exception()

Ben bir süre için şimdi masanın karşı başımı vurarak oldum ... Birisi yardımcı olabilir umuduyla. Belirli bir kaynağın önemli olduğunu düşünmüyorum, ancak istenirse yayınlayabilirim.

Ek çevresel ayrıntıları:

gr ++ version g ++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2 Copyright (C) 2012 Free Software Foundation, Inc. Bu bir serbest yazılımdır ; Kopyalama koşulları için kaynağına bakın. Hiçbir garanti yoktur; SATILABİLİRLİK veya BELİRLİ BİR AMACA UYGUNLUK İÇİN BAŞKA DEĞİL.

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. 

Ayrıca, bu bunu konularla burada sanmıyorum, ancak Windows 8'de Hyper-V altında çalışan bir VM üzerindedir.

tam bağlantı hattı: g ++ -L/usr/yerel/boost/1.44.0/lib -lboost_serialization -o test uygulama main.o derived.o base.o

+0

Sadece/usr/local gelen boost kütüphanelerinin kümesinden olabilir sorunları izole etmek çözmek gerekir kütüphaneler ve/usr/lib ve/usr/lerdeki başlıklar yerine orada başarıyla derler? – Tuxdude

+1

"make" çalışmakta olan gerçek bağlantı komutunu yapıştırın. –

+0

@ n.m. yukarıda bitti. Bu: g ++ -L/usr/local/boost/1.44.0/lib -lboost_serialization -o test-app main.o türetilmiş.o base.o –

cevap

8

I

g ++ -L/usr/yerel/boost/1.44.0/lib -o test uygulama main.o gibi sonunda -lboost_serialization koyarak, aynı sorun oldu derived.o base.o -lboost_serialization

sen it için Makefile işaret etmek deneyebilirsiniz, bu

+0

Bunu eve bir kez daha vereceğim. –

+0

Teşekkürler, bu işe yaradı. '-Wl, - start-group $ (LIBS) $^-Wl, - end-group' kullanmayı denedim ve bir grup içinde anlamlandırma konusundaki karar vermem gerekiyordu. Ben -Wl, - başlangıç ​​grubu $^$ (LIBS) -Wl, - son-grubu' yaptım, bağlantı çalıştı. Tuhaf. Siparişin bir grup içinde neden önemli olması gerektiğinden emin değil. –

-1

ikili nesne. o libs ile bağlantılı değildir.
önce, /usr/local/boost/1.44.0/lib dosyasında dosyanın lib boost_serialization olduğunu doğrulayın.
ve sonraki, bu lib kayıtlı:
sudo ldconfig -v | grep boost_serialization
değilse, boost1.44.0.conf dosyasını, kullanıcı köküyle /etc/ld.so.conf.d içinde oluşturun. Bu ligne ile
usr/local/boost/1.44.0/lib
sonra bu komutu başlatın
sudo ldconfig -v | grep boost_serialization

+3

Bu yanlış. Lütfen bunu yapma. Sistem-dışı bir kütüphane ile bağlantı kurmak istediğinizde, sistem çapında konfigürasyonları köklendirmenize ve değiştirmenize gerek yoktur. –

+0

-L seçeneğini kullanarak linker için doğru arama yollarını geçtiğiniz sürece ld.so.conf'a dokunmanız gerekmez. – Tuxdude