0
私はグラフ形式でデータをシリアライズして逆シリアル化しようとしています。私のグラフの定義は次のとおりです。BGL逆シリアル化のもう1つの問題
シリアライゼーションプロセスで問題はありませんが、デシリアライズ部分に問題があります。
#include <iomanip>
#include <iostream>
#include <fstream>
{
std::ifstream file(path,std::ios_base::binary);
boost::archive::binary_iarchive store{file};
store >> graph; // Deserialization part that triggers the error
}
私はここにいくつかの質問を読み取り、ブーストマニュアルを読み込もうとしましたが、彼らは私の問題を解決していない:コードのこの作品は、私のソースに追加されるまで実際には、私はリンクエラーを持っていません。特に、私はこのエラーを持っている:
Undefined symbols for architecture x86_64:
"void EFull::serialize<boost::archive::binary_iarchive>(boost::archive::binary_iarchive&, unsigned int)", referenced from:
void boost::serialization::access::serialize<boost::archive::binary_iarchive, EFull>(boost::archive::binary_iarchive&, EFull&, unsigned int) in boostOthers.cpp.o
"void GFull::serialize<boost::archive::binary_iarchive>(boost::archive::binary_iarchive&, unsigned int)", referenced from:
void boost::serialization::access::serialize<boost::archive::binary_iarchive, GFull>(boost::archive::binary_iarchive&, GFull&, unsigned int) in boostOthers.cpp.o
"void VFull::serialize<boost::archive::binary_iarchive>(boost::archive::binary_iarchive&, unsigned int)", referenced from:
void boost::serialization::access::serialize<boost::archive::binary_iarchive, VFull>(boost::archive::binary_iarchive&, VFull&, unsigned int) in boostOthers.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ちなみに、私は、シリアライズとデシリアライズ文字列と符号なし整数型を、「ネイティブデータ型」ブーストによってサポートされているように見えることだ:
//VERTICES
VFull::VFull() { }
VFull::VFull(unsigned int i, unsigned int h, unsigned int y, std::string p, std::string o) :
id{i}, hash{h}, year{y}, ip{p}, organization{o} {
}
template<class Archive> void VFull::serialize(Archive &ar, const unsigned int version) {
ar & 'i'; ar & id;
ar & 'h'; ar & hash;
ar & '1'; ar & ip;
ar & '2'; ar & organization;
ar & '3'; ar & year;
ar & '/';
}
///////
//EDGES
EFull::EFull() { }
template<class Archive> void EFull::serialize(Archive &ar, const unsigned int version) {
char waste = 'e';
ar & waste; }
///////
//GRAPH SIGNATURE
template<class Archive> void GFull::serialize(Archive &ar, const unsigned int version) {
std::string waste = "GBLS";
ar & waste;
}
///////
EDITはい、ソースコードをBGLとBoostのシリアル化の両方にリンクしています。これは、CMakeのスクリプトのこの部分を通っacheivedさ:シリアル化の方法は、テンプレートがある
find_package(Boost REQUIRED COMPONENTS graph serialization)
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED OFF)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS} ..some other stuff..)
TARGET_LINK_LIBRARIES(mycode ${Boost_LIBRARIES})