• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ serializacja wektora obiektów

Object Storage Arubacloud
0 głosów
670 wizyt
pytanie zadane 21 stycznia 2018 w C i C++ przez Deloryn Bywalec (2,060 p.)
edycja 21 stycznia 2018 przez Deloryn

Mógłby mi ktoś doradzić, jak umożliwić zapis wektora przechowującego obiekty stworzonych przeze mnie klas do pliku, a także późniejsze wczytanie danych do programu? Czy koniecznym byłoby własnoręczne napisanie odpowiedniego kodu?

Próbowałem z Boost::serialization. Męczyłem się z tym w ostatnich dniach przez kilka godzin w sumie. Projekt tworzę w CLionie. Niestety podczas buildu w momencie tworzenia pliku .exe pojawiają się undefined referencje do wielu, wielu metod. Opis błędów jest bardzo długi, jednak wszystko jest okej aż do generowania pliku wykonywalnego. Zgodnie z tutorialem dostosowałem klasy do serializacji, również te pochodne. Generalnie jeśli zakomentuję kod wewnątrz tych 2 metod, to nie ma problemu i program działa poprawnie:

 

void zapiszStan()
    {
        std::ofstream ofs("/zapis/zapisanyStan.ser");
        boost::archive::text_oarchive oa(ofs);
        oa & this->zbior;
    }
    void wczytajStan()
    {
        std::ifstream ifs("/zapis/zapisanyStan.ser");
        boost::archive::text_iarchive ia(ifs);
        ia & this->zbior;
    }

 

Wygląda też na to, że nawet jak pozostawię ten kod, ale nie odwołuję się do tych metod, to program działa.

Nie wiem już, co robić. Być może szybciej poszłoby napisanie własnego kodu. Może brakuje czegoś kompilatorowi, jakiejś biblioteki? Słabo jednak idzie mi posługiwanie się cmake'iem. Dodam jeszcze, że oczywiście robię include potrzebnych plików do wywołania tych metod w kodzie.

Tutaj wrzucam tekst błędów: https://pastebin.com/eSUpZZ9s

1 odpowiedź

+1 głos
odpowiedź 21 stycznia 2018 przez j23 Mędrzec (194,920 p.)

Z treści błędów wynika, że nie dodałeś biblioteki boosta. Internety mówią, że jej nazwa to libboost_serialization.

Co do cmake'a, spróbuj tak: target_link_libraries(<nazwa_exeka> <ścieżka>/libboost_serialization). Jeśli to nie zadziała, spróbuj z find_library()

komentarz 22 stycznia 2018 przez Deloryn Bywalec (2,060 p.)
Niestety nie zadziałało
komentarz 22 stycznia 2018 przez j23 Mędrzec (194,920 p.)

target_link_libraries() powinieneś dodać za wywołaniem add_executable()

 

Jaki kompilator? MinGW czy g++? Gdzie jest zainstalowany boost?

komentarz 22 stycznia 2018 przez Deloryn Bywalec (2,060 p.)
MinGW. Stworzyłem sobie folder na dysku C:/win32libs i tam jest folder "boost" z zawartością wypakowanej paczki. Zatem wewnątrz foldera "boost" jest kolejny folder "boost" i inne. Robiłem już też builda boosta i pojawiły się biblioteki w odpowiednich folderach.
komentarz 22 stycznia 2018 przez j23 Mędrzec (194,920 p.)

Jak wygląda wywołanie target_link_libraries?

komentarz 22 stycznia 2018 przez Deloryn Bywalec (2,060 p.)

Generalnie jak próbowałem target_link_libraries to miałem błąd co do pierwszego argumentu (plik wykonywalny). Próbowałem różnych wariantów i zawsze źle. Próbowałem też samo link_libraries i to działa.

Robiłem np. coś takiego:

include_directories(
        C:/win32libs/
        include
        boost
)

TARGET_LINK_LIBRARIES(EwidencjaOszczednosci_v2 C:/win32libs/boost/stage/lib)

Przy czym TARGET_LINK_LIBRARIES nie "zadziała", bo ma problem z pierwszym argumentem.

komentarz 22 stycznia 2018 przez j23 Mędrzec (194,920 p.)
W drugim parametrze powinieneś dać poza ścieżką także nazwę biblioteki, którą chcesz dołączyć.
komentarz 22 stycznia 2018 przez Deloryn Bywalec (2,060 p.)

TARGET_LINK_LIBRARIES mi nie działa, otrzymuję taki błąd:

"C:\Program Files\JetBrains\CLion 2017.3.1\bin\cmake\bin\cmake.exe" --build C:\Users\Jan\CLionProjects\EwidencjaOszczednosci_v2\cmake-build-debug --target all -- -j 2
CMake Error at CMakeLists.txt:13 (TARGET_LINK_LIBRARIES):
-- Configuring incomplete, errors occurred!
  Cannot specify link libraries for target "EwidencjaOszczednosci_v2" which
See also "C:/Users/Jan/CLionProjects/EwidencjaOszczednosci_v2/cmake-build-debug/CMakeFiles/CMakeOutput.log".
  is not built by this project.


mingw32-make.exe: *** [Makefile:505: cmake_check_build_system] Error 1

Próbowałem natomiast np. takiego wariantu:

LINK_LIBRARIES(C:/win32libs/boost/stage/lib/libboost_serialization-vc140-mt-x32-1_66.lib)
LINK_LIBRARIES(C:/win32libs/boost/stage/lib/libboost_serialization-vc140-mt-gd-x32-1_66.lib)
LINK_LIBRARIES(C:/win32libs/boost/stage/lib/libboost_serialization-vc140-mt-x64-1_66.lib)
LINK_LIBRARIES(C:/win32libs/boost/stage/lib/libboost_serialization-vc140-mt-gd-x64-1_66.lib)

Lub po prostu po jednej z tych 2 ostatnich bibliotek. Lub wszystkie cztery w jednym"LINK_LIBRARIES"). Wtedy cmake nie zgłasza błędu, ale nadal występuje ten błąd przy tworzeniu pliku wykonywalnego.

1
komentarz 22 stycznia 2018 przez j23 Mędrzec (194,920 p.)
Pierwszy i najważniejszy błąd, jaki robisz, jest taki, że próbujesz linkować visualową bibliotekę w MinGW.

 

Jeśli używasz MinGW, to z MSYS2...
komentarz 22 stycznia 2018 przez Deloryn Bywalec (2,060 p.)

Mógłbyś trochę wyjaśnić? Zainstalowałem MSYS2 i postępowałem zgodnie z instrukcją na ich stronie http://www.msys2.org/

Nadal mam ten błąd. Mam coś jeszcze zrobić?

1
komentarz 22 stycznia 2018 przez j23 Mędrzec (194,920 p.)
Rzecz w tym, że jak używasz MSYS2, to możesz sobie ściągnąć pacmanem boosta dla MinGW. Oczywiście powinieneś kompilować projekt kompilatorem z MSYSa (ze zmiennej środowiskowej PATH wywal ścieżkę do starego MinGW i dodaj nową).
komentarz 22 stycznia 2018 przez Deloryn Bywalec (2,060 p.)
Są pewne problemy, próbuję różnych rzeczy. Spróbuję jeszcze wieczorem, bo teraz muszę iść na zajęcia
komentarz 23 stycznia 2018 przez Deloryn Bywalec (2,060 p.)
Dziękuję za pomoc. Niestety nie udało mi się skorzystać z tej biblioteki. Niemniej jednak udało mi się napisać własny kod, który z powodzeniem realizuje zapis i odczyt wektora zawierającego obiekty moich klas.

Podobne pytania

+1 głos
1 odpowiedź 2,444 wizyt
pytanie zadane 24 lipca 2019 w Python przez Ziito Obywatel (1,110 p.)
0 głosów
0 odpowiedzi 584 wizyt
pytanie zadane 23 stycznia 2016 w Python przez Michał628496 Pasjonat (17,340 p.)
0 głosów
1 odpowiedź 754 wizyt
pytanie zadane 24 kwietnia 2022 w C i C++ przez Mavimix Dyskutant (8,390 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...