2017-02-02 17 views
0

У меня установлены библиотеки Boost на Ubuntu 14.04, и я пытаюсь создать пакет ros в рабочей области catkin. Пакет представляет собой систему автономной навигации беспилотного летательного аппарата, состоящую из трех компонентов: одна из них позволяет создать 3D-карту облачных точек. Моя цель - изменить этот пакет, чтобы сохранить и загрузить облачные очки, которые я получаю.Boost, ros and 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), которые обрабатывают команду в теме ролей:

//.. 
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 

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


EDIT: это мой 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

У вас есть CMake списки файлов, где вы добавляете файлы, которые вы хотите скомпилировать? Вы должны связать библиотеку Boost там. – PeterO

+0

@PeterO спасибо за ответ. Я добавляю файл в свой CMakeLists.txt (я нашел помощь в другом обсуждении). Мой файл в следующем ответе – jonyballerino

+0

@jonyballerino Лучше всего отредактируйте ваш вопрос и поставите CMakeLists.txt в свой вопрос, а не в ответ. –

ответ

0

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

Следующая StackOverflow адреса вопрос, почему это не работает: Why can templates only be implemented in the header file?