2016-10-04 2 views
6

Мы ловим ошибки компилятора при использовании sigemptyset на Cygwin под Newlib. Ошибка возникает с компилятором C++, но только тогда, когда используется -std=XXX. Без стандартной опции тестовая программа компилируется и выполняется, как ожидалось.Ошибка «sigemptyset не была объявлена ​​в этой области» при использовании C + 11 и Newlib

Ниже приведена тестовая программа, и ниже представлен заголовок Cygwin. Я не вижу ничего подозрительного в заголовке Cygwin.

Я пробовал трюки, такие как #define _GNU_SOURCE и #define _XOPEN_SOURCE 700. Я также пробовал трюки, например, используя глобальные и std пространства имен. См. Также: What does -D_XOPEN_SOURCE do/mean? и Namespace issues in 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); 
      ^

Things get worse when using -std=gnu++03 and friends.

+0

My * guess *? Когда вы используете простой стандарт C++ без расширений GNU, вам нужно определить '_XOPEN_SOURCE', прежде чем включать' '. –

+0

Кроме того, вы должны искать в '' для файла заголовка сигнала Cygwin. –

+0

Спасибо @Joachim. При grepping для 'sigemptyset' есть два обращения: (1)'/usr/include/bash/sig.h' и (2) '/ usr/include/sys/signal.h'. – jww

ответ

1

определению вопрос проработали на Botan 2.1.0 does not compile under Cygwin 2.8.0 with g++ 5.4.0. Вот два интересующих комментария.

Во-первых, из noloader:

Cygwin использует Newlib, не ГНУ libstdc++. Когда нет -std=c++XX, текущий GCC по умолчанию равен -std=gnu++11 (GCC 6 changes to gnu++14). I полагают, что источники GNU обеспечивают ожидаемые функции, такие как sigaction, являются .

Возможно, вы попробуете -D_XOPEN_SOURCE=600 или -D_XOPEN_SOURCE=700.

Также см. C++ and feature guards Warning Question на Newlib список рассылки.

Во-вторых, из SideChannel:

Благодаря @noloader. До сих пор -std=c++11 был установлен в Makefile. Важная информация находится в вышеупомянутой теме на рассылке Newlib . Яаков Selkowitz писал:

G ++ определяет _GNU_SOURCE на GLibC цели, а это означает, что -std=c++NN, вопреки документации, а не строгий ISO C++:

Таким образом, применяя patch #987 и установка -std=gnu++11 работы для меня , I не пробовал другой -D вариантов (я думаю, что другой факт более фундаментальный). Подводя итоги, @randombit, пожалуйста, примените PR # 987 и установите -std=gnu++11 для gcc под Cygwin.

2

Эта функция является расширением по стандарту 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 снижает возможности

+0

Спасибо Matzeri. Это интересно, как проблема возникает. Кажется, что все должно потерпеть неудачу, или все должно получиться. Как минимум, похоже, что '-std = gnu ++ XX' должен был скомпилироваться вместе с no -std', так как ни один из них не является ISO C. Если я правильно помню, некоторый' -std = gnu ++ XX' является значением по умолчанию, когда используя компилятор GCC C++. Я предполагаю, что NewLib делает то, что не существует в libstdC++. – jww

+0

Заголовки newlib находятся под перетасованием. За последние месяцы произошли заметные изменения, и '/ usr/include/sys/features.h' содержат текущие рекомендации. – matzeri

Смежные вопросы