В настоящее время возникают ошибки компоновщика, связанные с типами в пространстве имен 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.
Вы хоть представляете, что я могу сделать, чтобы решить эту проблему?
Большое спасибо за вашу помощь.