OpenBSD eg++ 4.9.3: включить многопоточность для использования std::thread: операция не разрешена

При попытке скомпилировать ansvif (фаззер) на OpenBSD с помощью g++ (eg++) из дерева портов все настраивается и компилируется нормально, пока я не запускаю программу в том месте, где она требует многопоточности.

Я пытаюсь скомпилировать так:

AUTOCONF_VERSION=2.69 AUTOMAKE_VERSION=1.15 aclocal
AUTOCONF_VERSION=2.69 AUTOMAKE_VERSION=1.15 autoconf
AUTOCONF_VERSION=2.69 AUTOMAKE_VERSION=1.15 automake -a
CXX=/usr/ports/pobj/gcc-4.9.3/bin/eg++ ./configure
make

Затем я получаю:

terminate called after throwing an instance of 'std::system_error'
what():  Enable multithreading to use std::thread: Operation not permitted
Abort trap (core dumped)

Кажется, это воспроизводимо только на OpenBSD 6.0 с g++ 4.9.3 из портов. Вы не можете скомпилировать код со встроенным g++, так как код требует C++11.

Обратная трасса выглядит так:

GNU gdb 6.3
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "amd64-unknown-openbsd6.0".
Core was generated by `ansvif'.
Program terminated with signal 6, Aborted.
#0  0x00000a5d2326029a in ?? ()
(gdb) bt
#0  0x00000a5d2326029a in ?? ()
#1  0x00000a5d23274039 in ?? ()
#2  0x00000a5d23280c0a in ?? ()
#3  0x00000a5a441cea80 in ?? ()
#4  0xffffffdf00000202 in ?? ()
#5  0xf296d56c8d2c4acf in ?? ()
#6  0x00000a5c54dc0198 in ?? ()
#7  0x00000a5a43d8b165 in ?? ()
#8  0x0000000000000000 in ?? ()

То же самое корректно компилируется и работает под Linux и Windows (с MinGW).

Я читал некоторые похожие проблемы, в которых говорится, что это ошибка компилятора, но хакерское «исправление», которое они предоставляют для него на SO, похоже, не помогает (используя -Wl,--no-as-needed) в этом случае.


person oxagast    schedule 24.03.2017    source источник
comment
AFAIK 4-й выпуск GCC по умолчанию использует старый стандарт С++ 98 (с расширениями GCC). std::thread - это функция С++ 11 (как вы правильно сказали). Это означает, что вам нужно строить с флагом -std=c++11. Вы строите с этим флагом? Вам также может понадобиться использовать флаг -pthread как при компиляции, так и при компоновке, чтобы убедиться, что потоки POSIX включены. Вы тоже строите с этим флагом?   -  person Some programmer dude    schedule 24.03.2017
comment
Да, я собираю с помощью ansvif_LDFLAGS = -I./include/gzstream -I./include/xml_writer -I./src/linux -pthread в файлах Makefile.am и AX_CXX_COMPILE_STDCXX_11 в файлах configure.ac. Во время компиляции вы можете видеть, что он использует -pthread и -std=c++11.   -  person oxagast    schedule 24.03.2017


Ответы (1)


Вы связываете код с libstdc++. Вместо этого вы должны использовать libestdc++.

person Rufo El Magufo    schedule 24.03.2017
comment
Спасибо, похоже, это сработало, хотя я также обнаружил еще одну ошибку в моем Makefile.am, когда собирался изменить его. else находился не там, где должен был быть, поэтому некоторый код вообще не передавался компилятору. Вы ведете меня в правильном направлении! - person oxagast; 24.03.2017
comment
Вы заслужили почетное упоминание в ansvif Wiki за вашу помощь! - person oxagast; 28.03.2017