Boost, ros и catkin — ошибка компоновщика

Я установил библиотеки Boost в Ubuntu 14.04 и пытаюсь собрать пакет ros в рабочей области catkin.
Пакет представляет собой систему для автономной навигации дрона, состоящую из трех компонентов: один из них позволяет создать трехмерную карту точек облачности.
Моя цель — изменить этот пакет, чтобы сохранить и загрузить полученные мной точки облака.

Я думал использовать библиотеки Boost для сериализации структуры данных, содержащей 3D-карту.

Это структура данных моей карты (с добавленной мной функцией сериализации):

#include <vector>
#include <TooN/se3.h>
#include <cvd/image.h>

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

struct MapPoint;
struct KeyFrame;

struct Map
{
Map();
inline bool IsGood() {return bGood;}
void Reset();

void MoveBadPointsToTrash();
void EmptyTrash();

template<class Archive>
void serialize(Archive & ar, const unsigned int version);

std::vector<MapPoint*> vpPoints;
std::vector<MapPoint*> vpPointsTrash;
std::vector<KeyFrame*> vpKeyFrames;

bool bGood;
};

И это моя реализация функции сериализации:

template<class Archive>
void Map::serialize(Archive & ar, const unsigned int version) {
ar & vpPoints;
ar & vpPointsTrash;
ar & vpKeyFrames;
}

Сериализация вызывается другим файлом (PTAMwrapper.cpp), который обрабатывает команду в теме ros:

//..
Map *mpMap;
//..

bool PTAMWrapper::handleCommand(std::string s)
{
if(s.length() == 4 && s.substr(0,4) == "save")
{
//save into file
const char *path="/home/user/Desktop/aGreatMap";
std::ofstream file(path); //open in constructor
// save data to archive
{
Map tMap = *mpMap;
boost::archive::text_oarchive oa(file);
// write class instance to archive
oa << tMap;
// archive and stream closed when destructors are called
}
}

//...

Когда я выпускаю catkin_make, операция не удалась, выдавая ошибку:

Linking CXX executable /home/user/catkin_ws/devel/lib/tum_ardrone/drone_stateestimation
CMakeFiles/drone_stateestimation.dir/src/stateestimation/PTAMWrapper.cpp.o: in function "serialize<boost::archive::text_oarchive, Map>":
/usr/local/include/boost/serialization/access.hpp:116: undefined reference to "void Map::serialize<boost::archive::text_oarchive>(boost::archive::text_oarchive&, unsigned int)"CMakeFiles/drone_stateestimation.dir/src/stateestimation/PTAMWrapper.cpp.o: in function "void boost::serialization::throw_exception<boost::archive::archive_exception>(boost::archive::archive_exception const&)":
/usr/local/include/boost/serialization/throw_exception.hpp:36: undefined reference to "boost::archive::archive_exception::archive_exception(boost::archive::archive_exception const&)"collect2: error: ld returned 1 exit status
make[2]: *** [/home/user/catkin_ws/devel/lib/tum_ardrone/drone_stateestimation] Error 1
make[1]: *** [tum_ardrone/CMakeFiles/drone_stateestimation.dir/all] Error 2
make: *** [all] Error 2
Invoking "make -j4 -l4" failed

Я думал, что это проблема связывания. Это правильно? Любые предложения, чтобы решить это?


РЕДАКТИРОВАТЬ: это мой файл CMakeLists.txt:

//...
find_package(catkin REQUIRED COMPONENTS
ardrone_autonomy
cv_bridge
dynamic_reconfigure
geometry_msgs
sensor_msgs
std_msgs
std_srvs
message_generation
roscpp
rospy
)

find_package(Boost COMPONENTS serialization REQUIRED)

//...

add_executable(drone_stateestimation ${STATEESTIMATION_SOURCE_FILES} ${STATEESTIMATION_HEADER_FILES})
set_target_properties(drone_stateestimation PROPERTIES COMPILE_FLAGS "-D_LINUX -D_REENTRANT -Wall  -O3 -march=nocona -msse3")
target_link_libraries(drone_stateestimation ${PTAM_LIBRARIES} ${catkin_LIBRARIES} ${Boost_SERIALIZATION_LIBRARY})
add_dependencies(drone_stateestimation thirdparty ${PROJECT_NAME}_gencpp ${PROJECT_NAME}_gencfg)

//...
add_executable(drone_autopilot ${AUTOPILOT_SOURCE_FILES} ${AUTOPILOT_HEADER_FILES})
target_link_libraries(drone_autopilot ${catkin_LIBRARIES} ${Boost_SERIALIZATION_LIBRARY})
add_dependencies(drone_autopilot thirdparty ${PROJECT_NAME}_gencpp ${PROJECT_NAME}_gencfg)

//...
add_executable(drone_gui ${GUI_SOURCE_FILES} ${GUI_RESOURCE_FILES_CPP} ${GUI_UI_FILES_HPP} ${GUI_HEADER_FILES_HPP})
target_link_libraries(drone_gui ${QT_LIBRARIES} cvd ${catkin_LIBRARIES} ${Boost_SERIALIZATION_LIBRARY})
add_dependencies(drone_gui thirdparty ${PROJECT_NAME}_gencpp ${PROJECT_NAME}_gencfg)

0

Решение

Проблема на самом деле заключается в вашем использовании C ++. У вас есть реализация функции шаблона в .cpp файл.

В следующем вопросе о стеке потока рассматривается, почему это не работает:
Почему шаблоны могут быть реализованы только в заголовочном файле?

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector