Ошибка при компиляции программы, использующей Boost Multiprecision, в mingw
Возникла у меня тут необходимость в вычислениях с произвольной точностью и решил я использовать Boost Multiprecision. Я скачал Boost 1.77 и попробовал скомпилировать с использованием mingw такую вот программу:
#include <iostream>
#include <boost/multiprecision/cpp_bin_float.hpp>
using namespace std;
int main()
{
cout << "Hello world!" << endl;
return 0;
}
Эта программа не скомпилировалась. Компилятор выдал ошибку:
C:\include\boost\math\special_functions\detail\bernoulli_details.hpp|559|error: 'mutex' in namespace 'std' does not name a type| C:\include\boost\math\special_functions\detail\bernoulli_details.hpp|21|note: 'std::mutex' is defined in header ''; did you forget to '#include mutex'?
ну и так далее. Заглянув в bernoulli_details.hpp, я увидел это:
#ifdef BOOST_HAS_THREADS
std::mutex m_mutex;
atomic_counter_type m_counter, m_current_precision;
#else
int m_counter;
int m_current_precision;
#endif // BOOST_HAS_THREADS
Немного удивившись тому, что в файле, где, по идее, должны считаться числа Бернулли, написано такое, я решил, что надо найти конфигурационный файл и убрать #define BOOST_HAS_THREADS. Мне не нужна многопоточность. Числа Бернулли мне, кстати, тоже не нужны. Как вы догадываетесь, я потерпел неудачу... Файлов, где определяется BOOST_HAS_THREADS, оказалось 18 штук. Часть из них - конфигурационные файлы платформ, остальное - файлы из разных математических библиотек Boost, где этот макрос переопределяется безусловно. Модифицировать все эти файлы, наверное, не стоит, да и смысла нет. Я удивился повторно и хочу спросить: можно ли всё-таки как-то откомпилировать мою программу в mingw или лучше бросить эту затею и юзать Visual Studio? В идеале хотелось бы как-то отключить многопоточность, раз уж для этого есть макрос и в mingw она сломана.
Ответы (2 шт):
многопоточность ... в mingw-w64 ... сломана
Ничего не сломано. В обычном MinGW (не w64) ее, вроде, до сих пор не подвезли, но в MinGW-w64 все должно работать.
Не надо руками ковыряться в бусте. Делаете вот что:
- Сносите все версии MinGW, которые у вас стоят.
- Устанавливаете MSYS2 и ставите MinGW оттуда, как описано здесь.
- Оттуда же ставите буст, командой
pacman -S mingw-w64-x86_64-boost - Дальше все должно работать из коробки.
Вам нужно установить MinGW с многопоточностью posix.
PS C:\Users\User\tmp\try-boost> g++.exe .\some.c++ -I .\boost_1_77_0\
In file included from .\boost_1_77_0/boost/multiprecision/traits/is_variable_precision.hpp:9,
from .\boost_1_77_0/boost/multiprecision/detail/precision.hpp:9,
from .\boost_1_77_0/boost/multiprecision/number.hpp:11,
from .\boost_1_77_0/boost/multiprecision/cpp_int.hpp:13,
from .\boost_1_77_0/boost/multiprecision/cpp_bin_float.hpp:9,
from .\some.c++:2:
.\boost_1_77_0/boost/multiprecision/detail/number_base.hpp:92:21: warning: thread_local on mingw is broken, please use MSys mingw gcc-9 or later, see https://sourceforge.net/p/mingw-w64/bugs/527/
#pragma GCC warning "thread_local on mingw is broken, please use MSys mingw gcc-9 or later, see https://sourceforge.net/p/mingw-w64/bugs/527/"
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Вот конфигурационная информация того варианта mingw-w64, который успешно собрал вашу программу.
PS C:\Users\User\tmp\try-boost> g++ -v
Using built-in specs.
COLLECT_GCC=D:\Software\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin\g++.exe
COLLECT_LTO_WRAPPER=D:/Software/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/8.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ...
Thread model: posix
gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)
Вариант mingw-w64 с многопоточностью win32 не определяет std::mutex:
PS C:\Users\User\tmp\try-boost> g++ -v
Using built-in specs.
COLLECT_GCC=D:\Software\x86_64-8.1.0-win32-seh-rt_v6-rev0\mingw64\bin\g++.exe
COLLECT_LTO_WRAPPER=D:/Software/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/8.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ...
Thread model: win32
gcc version 8.1.0 (x86_64-win32-seh-rev0, Built by MinGW-W64 project)
PS C:\Users\User\tmp\try-boost> g++ .\some.c++ -I .\boost_1_77_0\
In file included from .\boost_1_77_0/boost/multiprecision/traits/is_variable_precision.hpp:9,
from .\boost_1_77_0/boost/multiprecision/detail/precision.hpp:9,
from .\boost_1_77_0/boost/multiprecision/number.hpp:11,
from .\boost_1_77_0/boost/multiprecision/cpp_int.hpp:13,
from .\boost_1_77_0/boost/multiprecision/cpp_bin_float.hpp:9,
from .\some.c++:2:
.\boost_1_77_0/boost/multiprecision/detail/number_base.hpp:92:21: warning: thread_local on mingw is broken, please use MSys mingw gcc-9 or later, see https://sourceforge.net/p/mingw-w64/bugs/527/
#pragma GCC warning "thread_local on mingw is broken, please use MSys mingw gcc-9 or later, see https://sourceforge.net/p/mingw-w64/bugs/527/"
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from .\boost_1_77_0/boost/math/special_functions/bernoulli.hpp:16,
from .\boost_1_77_0/boost/math/special_functions/gamma.hpp:35,
from .\boost_1_77_0/boost/multiprecision/cpp_bin_float.hpp:24,
from .\some.c++:2:
.\boost_1_77_0/boost/math/special_functions/detail/bernoulli_details.hpp:559:9: error: 'mutex' in namespace 'std' does not name a type
std::mutex m_mutex;
^~~~~