2012-01-04 21 views
12

Yükseltme serileştirme kullanıyorum. Beraber derlenmiş: -L/opt/local/lib -lboost_serialization -stdlib=libc++, ancak birkaç (ungooglable) hataları var:Yükseltme serileştirme kullanılırken Linker hataları

 
Undefined symbols for architecture x86_64: 
    "boost::archive::text_oarchive_impl::save(std::__1::basic_string, std::__1::allocator > const&)", referenced from: 
     void boost::archive::save_access::save_primitive, std::__1::allocator > >(boost::archive::text_oarchive&, std::__1::basic_string, std::__1::allocator > const&) in main.o 
    "boost::archive::basic_text_oprimitive > >::~basic_text_oprimitive()", referenced from: 
     boost::archive::text_oarchive_impl::~text_oarchive_impl() in main.o 
    "boost::archive::text_oarchive_impl::text_oarchive_impl(std::__1::basic_ostream >&, unsigned int)", referenced from: 
     boost::archive::text_oarchive::text_oarchive(std::__1::basic_ostream >&, unsigned int) in main.o 
ld: symbol(s) not found for architecture x86_64 

Ben seri ediyorum bir std::vector<std::string>:

boost::archive::text_oarchive oa(std::cout); 
oa << tasks; 

boost benim yüklemesinde bir sorun var mı? Ben sudo port install boost +universal kullanarak destek yüklü

 
$ file libboost_serialization.dylib 
libboost_serialization.dylib: Mach-O universal binary with 2 architectures 
libboost_serialization.dylib (for architecture i386): Mach-O dynamically linked shared library i386 
libboost_serialization.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64 

:


boost kütüphaneleri hem 32-bit ve 64-bit makine kodu içeren evrensel ikili vardır (böylece sanırım sorun değil) Mac OS X 10.7'de.

+0

Belki boost kullandığınız olandan farklı derleyici ile inşa edilmiştir? Geçmişte macports ile benzer problemlerim vardı, ama detayları hatırlamak için çok uzun zaman önce. – ergosys

+0

Seri hale getirme kitaplığını nasıl kullanmaya çalıştığınızı gösteren küçük bir örnek gönderebilir misiniz? Kullanmadim ama calistigim bir çalisma vakti geldigimde sorunu takip edebilecegimden emindim ... (çalisir: problemi gösterir). –

cevap

16

Aşağıdaki kodu kullanarak sorunu yeniden olabilir:

#include "boost/archive/text_oarchive.hpp" 
#include "boost/serialization/vector.hpp" 
#include <vector> 
#include <string> 

int main() 
{ 
    std::vector<std::string> tasks; 
    boost::archive::text_oarchive oa(std::cout); 
    oa << tasks; 
} 

Bu, ilgili varsayılan bayraklarıyla g++ veya clang++ kullanarak ve -lboost_serialization ile bağlarken derler ve sorunsuz bağlantılar. Ben -stdlib = libC++ ile bir yapı kendi Boost istiyor farz Buna dayanarak

clang++ -c -stdlib=libc++ -I/opt/boost -W -Wall -ansi serialize.cpp 
clang++ -o serialize.tsk -L/opt/boost/stage/lib -stdlib=libc++ serialize.o -lboost_serialization 

: Ancak, libc++ bağlama ile clang++ kullanırken (I /opt/boost monte Yükseltme) genel esasen hata iletileri alıntı ile başarısız

tar jxvf ~/Downloads/boost_1_48_0.tar.bz2 
cd boost_1_48_0/tools/build/v2 

# change the build rules to use -stdlib=libc++: 
mv tools/clang-darwin.jam tools/clang-darwin.jam.orig 
sed -e 's/CONFIG_COMMAND)"/CONFIG_COMMAND)" -stdlib=libc++/' < tools/clang-darwin.jam.orig > tools/clang-darwin.jam 

./boostrap.sh 
sudo ./b2 install --prefix=/opt/boost-clang 
cd ../../.. 
/opt/boost-clang/bin/b2 --build-dir=/opt/tmp toolset=clang stage 
sudo /opt/boost-clang/bin/b2 --build-dir=/opt/tmp toolset=clang install --prefix=/opt/boost-clang 

Ben neredeyse kesin olanlar amaçlanmamıştır clang-darwin.jam yapılan düzenlemeler ancak hile yapmak gibi görünüyor: inşa etmek ve bir tane inşa Boost installation guide dayalı kullanarak ben "bjam" hakkında fazla bilgi sahibi ve sadece yok uygun bir yer bulmaya çalıştı değişikliği uygulayın. Yükleme işleminin bazı adımları, korumalı dizinlere yüklemek için sudo'u kullanır. Açıkçası, yazma izninizin olduğu başka bir dizine de yükleyebilirsiniz. Makinemdeki şeyleri kazara fırlatmamı engelleyecek bir şekilde kurdum. Ben programı başarıyla inşa edebileceğini etapta bu kuruluma Ancak

:

/opt/llvm/bin/clang++ -stdlib=libc++ -W -Wall -ansi -I/opt/boost-clang -c -o serialize.o serialize.cpp 
/opt/llvm/bin/clang++ -stdlib=libc++ -L/opt/boost-clang/lib serialize.o -lboost_serialization -o serialize.tsk 
0

Destek kütüphaneleriniz 32 bitmiş gibi görünüyor.

Yalnızca başlık olmayan birkaç güçlendirici aracından birini kullanmaya çalışana dek fark etmeyeceğiniz bir sorun.

+0

Evrensel ikili dosyalar ile desteği yeniden yüklüyorum. brb –

+2

"file * boost_ser * .so" komutunu çalıştırın. 32 bit kemer veya 64 bit kemer için olup olmadığını size söyleyecektir. – Arunmu

+0

"libboost_serialization.dylib: Mach-O 64-bit dinamik olarak bağlantılı paylaşımlı kütüphane x86_64 "mmm… –