Ошибки компоновщика, связанные с пространством имен std :: __ cxx11 - проблема двойного ABI - PullRequest
0 голосов
/ 06 мая 2019

В настоящее время возникают ошибки компоновщика, связанные с типами в пространстве имен std :: __ cxx11 .

Вот мой код:

#include <iostream>
#include <boost/locale.hpp>

int main()
{
    std::wstring text = L"Coucou";

    std::string latin1 = boost::locale::conv::from_utf(text, "Latin1");

    return 0;
}

Вот ошибка, которую я имею:

19:31:13 **** Incremental Build of configuration Debug for project tests_boost_asio ****
Info: Internal Builder is used for build
g++ "-IC:\\Program Files (x86)\\boost\\boost_1_69_0" -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\tests_boost_asio.o" "..\\src\\tests_boost_asio.cpp" 
In file included from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale.hpp:22,
                 from ..\src\tests_boost_asio.cpp:10:
C:\Program Files (x86)\boost\boost_1_69_0/boost/locale/localization_backend.hpp:109:18: warning: 'template<class> class std::auto_ptr' is deprecated [-Wdeprecated-declarations]
             std::auto_ptr<localization_backend> get() const;
                  ^~~~~~~~
In file included from C:/mingw/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/locale_conv.h:41,
                 from C:/mingw/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/locale:43,
                 from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale/boundary/facets.hpp:17,
                 from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale/boundary.hpp:12,
                 from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale.hpp:11,
                 from ..\src\tests_boost_asio.cpp:10:
C:/mingw/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/unique_ptr.h:53:28: note: declared here
   template<typename> class auto_ptr;
                            ^~~~~~~~
In file included from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale.hpp:22,
                 from ..\src\tests_boost_asio.cpp:10:
C:\Program Files (x86)\boost\boost_1_69_0/boost/locale/localization_backend.hpp:116:59: warning: 'template<class> class std::auto_ptr' is deprecated [-Wdeprecated-declarations]
             void add_backend(std::string const &name,std::auto_ptr<localization_backend> backend);
                                                           ^~~~~~~~
In file included from C:/mingw/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/locale_conv.h:41,
                 from C:/mingw/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/locale:43,
                 from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale/boundary/facets.hpp:17,
                 from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale/boundary.hpp:12,
                 from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale.hpp:11,
                 from ..\src\tests_boost_asio.cpp:10:
C:/mingw/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/unique_ptr.h:53:28: note: declared here
   template<typename> class auto_ptr;
                            ^~~~~~~~
In file included from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale.hpp:24,
                 from ..\src\tests_boost_asio.cpp:10:
C:\Program Files (x86)\boost\boost_1_69_0/boost/locale/util.hpp:180:28: warning: 'template<class> class std::auto_ptr' is deprecated [-Wdeprecated-declarations]
     BOOST_LOCALE_DECL std::auto_ptr<base_converter> create_utf8_converter();
                            ^~~~~~~~
In file included from C:/mingw/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/locale_conv.h:41,
                 from C:/mingw/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/locale:43,
                 from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale/boundary/facets.hpp:17,
                 from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale/boundary.hpp:12,
                 from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale.hpp:11,
                 from ..\src\tests_boost_asio.cpp:10:
C:/mingw/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/unique_ptr.h:53:28: note: declared here
   template<typename> class auto_ptr;
                            ^~~~~~~~
In file included from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale.hpp:24,
                 from ..\src\tests_boost_asio.cpp:10:
C:\Program Files (x86)\boost\boost_1_69_0/boost/locale/util.hpp:188:28: warning: 'template<class> class std::auto_ptr' is deprecated [-Wdeprecated-declarations]
     BOOST_LOCALE_DECL std::auto_ptr<base_converter> create_simple_converter(std::string const &encoding);
                            ^~~~~~~~
In file included from C:/mingw/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/locale_conv.h:41,
                 from C:/mingw/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/locale:43,
                 from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale/boundary/facets.hpp:17,
                 from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale/boundary.hpp:12,
                 from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale.hpp:11,
                 from ..\src\tests_boost_asio.cpp:10:
C:/mingw/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/unique_ptr.h:53:28: note: declared here
   template<typename> class auto_ptr;
                            ^~~~~~~~
In file included from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale.hpp:24,
                 from ..\src\tests_boost_asio.cpp:10:
C:\Program Files (x86)\boost\boost_1_69_0/boost/locale/util.hpp:203:59: warning: 'template<class> class std::auto_ptr' is deprecated [-Wdeprecated-declarations]
     std::locale create_codecvt(std::locale const &in,std::auto_ptr<base_converter> cvt,character_facet_type type);
                                                           ^~~~~~~~
In file included from C:/mingw/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/locale_conv.h:41,
                 from C:/mingw/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/locale:43,
                 from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale/boundary/facets.hpp:17,
                 from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale/boundary.hpp:12,
                 from C:\Program Files (x86)\boost\boost_1_69_0/boost/locale.hpp:11,
                 from ..\src\tests_boost_asio.cpp:10:
C:/mingw/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/unique_ptr.h:53:28: note: declared here
   template<typename> class auto_ptr;
                            ^~~~~~~~
g++ -o tests_boost_asio.exe "src\\tests_boost_asio.o" 
src\tests_boost_asio.o: In function `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > boost::locale::conv::from_utf<wchar_t>(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::locale::conv::method_type)':
C:/Program Files (x86)/boost/boost_1_69_0/boost/locale/encoding.hpp:84: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > boost::locale::conv::from_utf<wchar_t>(wchar_t const*, wchar_t const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::locale::conv::method_type)'
collect2.exe: error: ld returned 1 exit status

19:31:14 Build Failed. 1 errors, 5 warnings. (took 1s.286ms)

Согласно моим исследованиям, у меня нормальные предупреждения.

Ошибка в следующих строках:

g++ -o tests_boost_asio.exe "src\\tests_boost_asio.o" 
src\tests_boost_asio.o: In function `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > boost::locale::conv::from_utf<wchar_t>(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::locale::conv::method_type)':
C:/Program Files (x86)/boost/boost_1_69_0/boost/locale/encoding.hpp:84: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > boost::locale::conv::from_utf<wchar_t>(wchar_t const*, wchar_t const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::locale::conv::method_type)'
collect2.exe: error: ld returned 1 exit status

Мой компилятор: mingw-w64 (версия: 4.3)

Моя версия наддува: 1.70.0

Версия GCC, которую я использовал для компиляции boost: 8.1.0

Обратите внимание, что проблема известна и описана на следующих страницах:

Согласно ссылкам, я, вероятно, пытаюсь связать воедино объекты, которые были скомпилированы с различными значениями для макроса _GLIBCXX_USE_CXX11_ABI. «Обычно это происходит при подключении к сторонней библиотеке, которая была скомпилирована с более старой версией GCC. Если сторонняя библиотека не может быть перестроена с новым ABI, вам нужно будет перекомпилировать ваш код со старым ABI. ”

Что я пробовал:

  • Я пытался определить следующий макрос перед тем, как включить любой заголовок стандартной библиотеки: #define _GLIBCXX_USE_CXX11_ABI 0

Если я установлю этот макрос на 0, я получу другую ошибку:

19:48:01 **** Incremental Build of configuration Debug for project tests_boost_asio ****
Info: Internal Builder is used for build
g++ -o tests_boost_asio.exe "src\\tests_boost_asio.o" 
src\tests_boost_asio.o: In function `std::string boost::locale::conv::from_utf<wchar_t>(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::string const&, boost::locale::conv::method_type)':
C:/Program Files (x86)/boost/boost_1_69_0/boost/locale/encoding.hpp:84: undefined reference to `std::string boost::locale::conv::from_utf<wchar_t>(wchar_t const*, wchar_t const*, std::string const&, boost::locale::conv::method_type)'
collect2.exe: error: ld returned 1 exit status

19:48:01 Build Failed. 1 errors, 0 warnings. (took 162ms)

Эта ошибка может указывать на то, что функция не определена в Boost, чего я не понимаю, потому что Eclipse не находит никаких проблем, и я нахожу подобные примеры в интернете. И вообще, это на самом деле не решает проблему. Это заставило бы меня использовать старый ABI.

Если я установлю этот макрос на 1, у меня все еще будет первая ошибка.

Обратите внимание, что я также пытался определить этот макрос непосредственно в параметрах компилятора.

Я также пытался перекомпилировать Boost с другими опциями:

b2 cxxflags="-std=c++11" define=_GLIBCXX_USE_CXX11_ABI=1 install -j5 --toolset=gcc

Это не имеет значения.

Ничего не работает. Я немного растерялся. Я подозреваю, что за это отвечает mingw-w64.

Я также мог бы попытаться изменить компилятор, но если я правильно понял, mingw особенно подходит, если я хочу, чтобы мои программы работали так же под Windows, как и под Linux? Я часто занимаюсь разработкой под Windows, но обязательно, чтобы моя программа работала под Linux.

Вы хоть представляете, что я могу сделать, чтобы решить эту проблему?

Большое спасибо за вашу помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...