2012-01-04 26 views
12

Tôi đang sử dụng tính năng tuần tự hóa tăng cường. Tôi biên soạn với: -L/opt/local/lib -lboost_serialization -stdlib=libc++, nhưng có một số (ungooglable) lỗi:Lỗi trình liên kết khi sử dụng tuần tự tăng cường

 
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 

Tôi serializing một std::vector<std::string>:

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

Có một vấn đề với cài đặt của tôi tăng?


Các thư viện tăng là mã nhị phân phổ chứa cả 32-bit và 64-bit mã máy (vì vậy đó không phải là vấn đề tôi đoán):

 
$ 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 

Tôi đã cài đặt tăng sử dụng sudo port install boost +universal trên Mac OS X 10.7.

+0

lẽ tăng được xây dựng với trình biên dịch khác với những gì bạn đang sử dụng? Tôi đã có vấn đề tương tự với macports trong quá khứ, nhưng quá lâu trước đây để nhớ các chi tiết. – ergosys

+0

Bạn có thể đăng một ví dụ nhỏ cho thấy cách bạn đang cố gắng sử dụng thư viện tuần tự hóa không? Tôi đã không sử dụng nó nhưng tôi khá tự tin rằng tôi có thể theo dõi vấn đề một khi tôi có một trường hợp thử nghiệm làm việc ... (làm việc như trong: cho thấy vấn đề). –

Trả lời

16

tôi có thể tạo lại vấn đề bằng cách sử dụng đoạn mã sau:

#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; 
} 

này biên dịch và liên kết không có vấn đề khi sử dụng g++ hoặc clang++ với cờ mặc định tương ứng của họ và liên kết với -lboost_serialization. Tuy nhiên, khi sử dụng clang++ với libc++ liên kết không thành công với bản chất các thông báo lỗi quote (Tôi đã Boost lắp đặt tại /opt/boost):

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 

Dựa trên này, tôi cho rằng một xây dựng với -stdlib = libC++ muốn có Boost riêng của mình xây dựng và xây dựng một bằng cách sử dụng dựa trên Boost installation guide:

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 

việc sửa đổi tôi thực hiện để clang-darwin.jam được gần như chắc chắn không phải là những dự định nhưng họ dường như làm các trick: tôi không biết nhiều về "bjam" và tôi chỉ cố gắng tìm một vị trí thích hợp để áp dụng thay đổi. Một số bước cài đặt sử dụng sudo để cài đặt mọi thứ vào các thư mục được bảo vệ. Rõ ràng, bạn có thể cài đặt vào một số thư mục khác, nơi bạn có quyền ghi là tốt. Tôi chỉ cài đặt mọi thứ trên máy tính của mình theo cách ngăn tôi vô tình làm rối tung nó lên.

Tuy nhiên, với việc cài đặt này trong nơi tôi có thể xây dựng thành công chương trình:

/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

Dường như thư viện tăng của bạn có thể là 32 bit.

Đó là vấn đề mà bạn sẽ không nhận thấy cho đến khi bạn cố gắng sử dụng một trong số ít utils tăng cường không chỉ là tiêu đề.

+0

Tôi đang cài đặt lại tăng cường với các tệp nhị phân phổ biến. brb –

+2

Chạy lệnh "tệp * boost_ser * .so". Nó sẽ cho bạn biết liệu nó có dành cho vòm 32 bit hoặc vòm 64 bit hay không. – Arunmu

+0

"libboost_serialization.dylib: Mach-O 64-bit liên kết động được chia sẻ thư viện x86_64 "mmm ... –

Các vấn đề liên quan