2016-10-04 13 views
6

Łapiemy błędy kompilatora podczas korzystania z sigemptyset na Cygwin pod Newlib. Błąd występuje w kompilatorze C++, ale tylko wtedy, gdy użyto -std=XXX. Bez standardowej opcji program testowy kompiluje się i wykonuje zgodnie z oczekiwaniami.Błąd "nie określono wartości w tym zakresie" podczas korzystania z C + 11 i Newlib

Program testowy znajduje się poniżej, a nagłówek interesujący Cygwin następuje. Nie widzę niczego podejrzanego w nagłówku Cygwin.

Próbowałem sztuczek takich jak #define _GNU_SOURCE i #define _XOPEN_SOURCE 700. Próbowałem również sztuczek, takich jak używanie przestrzeni nazw globalnych i std. Powiązane, zobacz What does -D_XOPEN_SOURCE do/mean? i Namespace issues in c++11?.

Co powoduje awarię kompilacji i jak ją naprawić?


$ cat ~/test.cxx 
#include <signal.h> 

int main(int argc, char* argv[]) 
{ 
    struct sigaction new_handler; 
    return sigemptyset(&new_handler.sa_mask); 
} 

Bez -std=XXX, skutkuje:

$ g++ -c test.cxx 
$ 

Z -std=XXX, skutkuje:

$ 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); 

A kiedy próbują wykorzystać sigemptyset w globalnej przestrzeni nazw :

$ 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

Moje * zgadnij *? Kiedy używasz zwykłego standardu C++ bez rozszerzeń GNU, musisz zdefiniować '_XOPEN_SOURCE' przed dodaniem' '. –

+0

Powinieneś też szukać w '' dla pliku nagłówkowego sygnału Cygwin. –

+0

Dzięki @ Joachim. Kiedy grepping dla 'sigemptyset' ma dwa trafienia: (1)'/usr/include/bash/sig.h' i (2) '/ usr/include/sys/signal.h'. – jww

Odpowiedz

1

Emisja została opracowana przez co Botan 2.1.0 does not compile under Cygwin 2.8.0 with g++ 5.4.0. Oto dwie interesujące komentarze.

Po pierwsze, od noloader:

Cygwin wykorzystuje newlib nie GNU na libstdc++. Gdy nie ma domyślnej wartości GCC, domyślnie jest to -std=gnu++11 (GCC 6 changes to gnu++14). I wierzę, że źródła GNU zapewniają oczekiwane funkcje, takie jak sigaction, są dostępne .

Możesz rozważyć wypróbowanie -D_XOPEN_SOURCE=600 lub -D_XOPEN_SOURCE=700.

Zobacz także C++ and feature guards Warning Question na liście mailingowej Newlib .

Po drugie, z SideChannel:

Dzięki @noloader. Do tej pory -std=c++11 został ustawiony w Makefile. Ważna informacja znajduje się w powyższym wątku na liście mailingowej Newlib . Yaakov Selkowitz napisał:

G ++ definiuje _GNU_SOURCE na cele glibc, co oznacza, że ​​-std=c++NN jest sprzeczne z dokumentacją, a nie ścisłe ISO C++:

Więc nałożeniem patch #987 i ustawienie -std=gnu++11 pracuje dla mnie . I nie wypróbowałem innych opcji -D (uważam, że inny fakt jest bardziej podstawowy). Podsumowując, @randombit zastosuj PR # 987 i ustaw -std=gnu++11 dla gcc pod Cygwin.

2

Ta funkcja jest rozszerzeniem w stosunku do standardu ISO C.
http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigemptyset.html

jako taki jest zabezpieczony na /usr/include/sys/signal.h przez
__XSI_VISIBLE> = 4

patrz /usr/include/sys/features.h szczegóły.

jako domyślne największy zbiór definicji jest używany, ale -std=XXX ogranicza zakres definicji

+0

Dzięki Matzeri. Jest interesujący sposób, w jaki problem się pojawia. Wygląda na to, że wszystko powinno zawieść, albo wszystko powinno się powieść. Co najmniej wygląda na to, że '-std = gnu ++ XX' powinno być skompilowane razem z żadnym' -std', ponieważ żaden z nich nie ma wartości ISO C. Jeśli dobrze pamiętam, niektóre '-std = gnu ++ XX 'są domyślne przy użyciu kompilatora C++ GCC. Myślę, że jest to sposób, w jaki newlib robi rzeczy, ponieważ nie jest obecny w libstdC++. – jww

+0

Nagłówki newlib są ponownie przetasowywane. W ostatnich miesiącach odnotowano znaczne zmiany, a '/ usr/include/sys/features.h' podaje aktualne wytyczne. – matzeri

Powiązane problemy