Boost на ОС Ma c Неопределенные символы - PullRequest
0 голосов
/ 13 марта 2020

У меня проблемы с компиляцией программы на С ++, включая библиотеку boost. Проблемы, похоже, начали возникать после того, как я обновился до Catalina, прежде чем все заработало правильно.

Я использую boost, установленный через homebrew («brew install boost»), и компилирую программу с g ++ версии 9, также установленной с homebrew.

При компиляции с "g ++ - 9 -I / usr / local / include -L / usr / local / lib -lboost_serialization test. cc" библиотеки правильно найдены компилятором, но возникает следующая ошибка , Ниже я включаю сообщение об ошибке и тестовую программу, которая его вызывает.

Интересное наблюдение состоит в том, что имя в сообщении об ошибке, обозначаемом как "cclgNgf3.o", изменяется каждый раз, когда я компилирую. До сих пор я также получил "ccmG1kWi.o" и "cc25AYXh.o".

Undefined symbols for architecture x86_64:
  "boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
      void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::archive::text_oarchive&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) in cclgNgf3.o
  "boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::text_oarchive_impl(std::basic_ostream<char, std::char_traits<char> >&, unsigned int)", referenced from:
      boost::archive::text_oarchive::text_oarchive(std::basic_ostream<char, std::char_traits<char> >&, unsigned int) in cclgNgf3.o
  "boost::archive::basic_text_oprimitive<std::basic_ostream<char, std::char_traits<char> > >::~basic_text_oprimitive()", referenced from:
      boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::~text_oarchive_impl() in cclgNgf3.o
      boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::~text_oarchive_impl() in cclgNgf3.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
#include <boost/archive/text_oarchive.hpp>
#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
    boost::archive::text_oarchive oa{cout};
    return 0;
}

На случай, если это может быть актуально при компиляции с помощью компилятора macOS clang, вызвав "g ++ -lboost_serialization" test. cc "выводится следующее сообщение об ошибке.

test.cc:8:32: error: no matching constructor for initialization of 'boost::archive::text_oarchive'
        boost::archive::text_oarchive oa{cout};
                                      ^
/usr/local/include/boost/archive/text_oarchive.hpp:98:28: note: candidate constructor (the implicit copy constructor) not viable: requires 1
      argument, but 0 were provided
class BOOST_SYMBOL_VISIBLE text_oarchive : 
                           ^
/usr/local/include/boost/archive/text_oarchive.hpp:102:5: note: candidate constructor not viable: requires at least argument 'os_', but no arguments
      were provided
    text_oarchive(std::ostream & os_, unsigned int flags = 0) :
    ^
test.cc:8:34: error: expected ';' at end of declaration
        boost::archive::text_oarchive oa{cout};
                                        ^
                                        ;
2 errors generated.

1 Ответ

0 голосов
/ 23 марта 2020

Я создал boost вручную, используя g cc вместо clang, и теперь он работает. Может показаться, что brew-версия построена с использованием clang, и тогда, когда я пытаюсь собрать свой проект, используя g cc, мы получаем конфликты стандартных библиотек.

...