2016-10-04 1 views
6

Nous sommes en train d'attraper des erreurs de compilateur lorsque vous utilisez sigemptyset sur Cygwin sous Newlib. L'erreur se produit avec un compilateur C++, mais seulement lorsque -std=XXX est utilisé. Sans une option standard, le programme de test compile et s'exécute comme prévu.Erreur "sigemptyset n'a pas été déclaré dans cette portée" lors de l'utilisation de C + 11 et Newlib

Le programme de test est ci-dessous, et l'en-tête Cygwin d'intérêt suit. Je ne vois rien de suspect dans l'en-tête de Cygwin. J'ai essayé des astuces comme #define _GNU_SOURCE et #define _XOPEN_SOURCE 700. J'ai également essayé des trucs comme utiliser les espaces de noms globaux et std. En relation, voir What does -D_XOPEN_SOURCE do/mean? et Namespace issues in c++11?.

Qu'est-ce qui cause l'échec de la compilation et comment le réparer?


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

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

Sans -std=XXX, il en résulte:

$ g++ -c test.cxx 
$ 

Avec un -std=XXX, il en résulte:

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

Et en essayant d'utiliser sigemptyset dans l'espace de noms global :

$ 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

Mes * estimations *? Lorsque vous utilisez un standard C++ sans extensions GNU, vous devez définir '_XOPEN_SOURCE' avant d'inclure' '. –

+0

En outre, vous devriez regarder '' pour le fichier d'en-tête du signal Cygwin. –

+0

Merci @Joachim. Lors de l'exécution de 'sigemptyset' il y a deux hits: (1)'/usr/include/bash/sig.h' et (2) '/ usr/include/sys/signal.h'. – jww

Répondre

1

La question a été travaillé par au Botan 2.1.0 does not compile under Cygwin 2.8.0 with g++ 5.4.0. Voici les deux commentaires d'intérêt.

D'abord, de noloader:

Cygwin utilise newlib, pas GNU de libstdc++. Lorsqu'il n'y a pas de -std=c++XX, la valeur par défaut de GCC est -std=gnu++11 (GCC 6 changes to gnu++14 par défaut). Je pense que les sources GNU assure les fonctions attendues, comme sigaction, sont disponibles.

Vous pouvez essayer -D_XOPEN_SOURCE=600 ou -D_XOPEN_SOURCE=700.

Voir également C++ and feature guards Warning Question sur la liste de diffusion Newlib .

En second lieu, de SideChannel:

Merci à @noloader. Jusqu'à présent, -std=c++11 a été défini dans Makefile. L'information importante est dans le fil mentionné ci-dessus sur la liste de diffusion Newlib . Yaakov Selkowitz a écrit:

G ++ définit _GNU_SOURCE sur les cibles de la glibc, ce qui signifie que -std=c++NN est, contrairement à la documentation, pas stricte ISO C++:

Ainsi, l'application de la patch #987 ET mise en -std=gnu++11 fonctionne pour moi . Je n'a pas essayé les autres options -D (je pense que l'autre fait est plus fondamental ). Pour résumer, @randombit, veuillez appliquer le PR # 987 et définir -std=gnu++11 pour gcc sous Cygwin.

2

La fonction est une extension par rapport à la norme ISO C.
http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigemptyset.html

en tant que telle est protégé par /usr/include/sys/signal.h
__XSI_VISIBLE> = 4

voir /usr/include/sys/features.h pour plus de détails.

Comme défaut le plus grand ensemble de définition est utilisée, mais -std=XXX réduit la portée de la définition

+0

Merci Matzeri. C'est intéressant la façon dont le problème se pose. Il semble que tout devrait échouer, ou tout devrait réussir. Au minimum, il semble que '-std = gnu ++ XX' aurait dû être compilé avec pas de' -std' puisque ni l'ISO C. Si je me souviens bien, un '-std = gnu ++ XX' est un défaut quand en utilisant le compilateur C++ de GCC. Je suppose que c'est la façon dont newlib fait les choses car il n'est pas présent dans libstdC++. – jww

+0

Les en-têtes newlib sont en cours de re-shuffle. Il y a eu des changements notables au cours des derniers mois et '/ usr/include/sys/features.h' fournissent les directives actuelles. – matzeri