Мы ловим ошибки компилятора при использовании sigemptyset
на Cygwin под Newlib. Ошибка происходит с компилятором C ++, но только когда -std=XXX
используется. Без стандартного параметра тестовая программа компилируется и выполняется так, как ожидается.
Тестовая программа ниже, а интересующий заголовок Cygwin следует. Я не вижу ничего подозрительного в заголовке Cygwin.
Я пробовал такие трюки, как #define _GNU_SOURCE
а также #define _XOPEN_SOURCE 700
, Я также попробовал трюки, такие как использование глобального и std
Пространства имен. Связанные, см. Что означает / D_XOPEN_SOURCE? а также Проблемы с пространством имен в C ++ 11?.
Что вызывает сбой компиляции и как я могу это исправить?
$ cat ~/test.cxx
#include <signal.h>
int main(int argc, char* argv[])
{
struct sigaction new_handler;
return sigemptyset(&new_handler.sa_mask);
}
Без -std=XXX
, это приводит к:
$ g++ -c test.cxx
$
С -std=XXX
, это приводит к:
$ g++ -std=c++03 -c test.cxx
test.cxx: In function int main(int, char**):
test.cxx:6:44: error: sigemptyset was not declared in this scope
return sigemptyset(&new_handler.sa_mask);
И при попытке использовать sigemptyset
в глобальном пространстве имен:
$ g++ -std=c++03 -c test.cxx
test.cxx: In function ‘int main(int, char**)’:
test.cxx:6:12: error: ‘::sigemptyset’ has not been declared
return ::sigemptyset(&new_handler.sa_mask);
^
Эта функция является расширением стандарта ISO C.
http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigemptyset.html
как таковой защищен на /usr/include/sys/signal.h
от
__XSI_VISIBLE> = 4
увидеть /usr/include/sys/features.h
для деталей.
По умолчанию используется самый большой набор определений, но -std=XXX
уменьшает область определения
Проблема была проработана в Botan 2.1.0 не компилируется под Cygwin 2.8.0 с g ++ 5.4.0. Вот два комментария, представляющих интерес.
Во-первых, из noloader:
Cygwin использует Newlib, а не GNU
libstdc++
, Когда нет
-std=c++XX
текущий GCC по умолчанию-std=gnu++11
(GCC 6 изменений
вgnu++14
по умолчанию). я
полагаю, что источники GNU обеспечивают ожидаемые функции, такие какsigaction
, являются
имеется в наличии.Вы можете попробовать
-D_XOPEN_SOURCE=600
или же
-D_XOPEN_SOURCE=700
,Также см C ++ и функции защиты
Вопрос на
Список рассылки Newlib.
Во-вторых, из SideChannel:
Спасибо @noloader. До сих пор
-std=c++11
был установлен вMakefile
,
важная информация в вышеупомянутой теме на рассылке Newlib
список. Яаков Сельковиц написал:G ++ определяет
_GNU_SOURCE
на цели glibc, что означает, что-std=c++NN
В отличие от документации, не является строгим стандартом ISO C ++:Итак, применяя патч № 987
И настройка-std=gnu++11
работает для меня. я
не пробовал другой-D
варианты (я думаю, что другой факт больше
фундаментальная). Подводя итог, @randombit, пожалуйста, примените PR # 987 и установите
-std=gnu++11
для gcc под Cygwin.