使用 C+11 和 Newlib 时出现错误 "sigemptyset was not declared in this scope"
Error "sigemptyset was not declared in this scope" when using C+11 and Newlib
我们在 Newlib 下的 Cygwin 上使用 sigemptyset
时捕获编译器错误。该错误发生在 C++ 编译器中,但仅在使用 -std=XXX
时才会发生。没有标准选项,测试程序按预期编译和执行。
下面是测试程序,后面是感兴趣的Cygwinheader。我在 Cygwin header.
中没有发现任何可疑之处
我尝试过 #define _GNU_SOURCE
和 #define _XOPEN_SOURCE 700
等技巧。我还尝试过使用全局和 std
命名空间等技巧。相关见What does -D_XOPEN_SOURCE do/mean? and 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);
^
该函数是对 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 does not compile under Cygwin 2.8.0 with g++ 5.4.0 解决。这是感兴趣的两个评论。
首先,来自noloader:
Cygwin uses Newlib, not GNU's libstdc++
. When there's no
-std=c++XX
, current GCC defaults to -std=gnu++11
(GCC 6 changes
to gnu++14
by default). I
believe GNU sources ensures expected functions, like sigaction
, are
available.
You might consider trying -D_XOPEN_SOURCE=600
or
-D_XOPEN_SOURCE=700
.
Also see C++ and feature guards Warning
Question on the
Newlib mailing list.
其次,来自SideChannel:
Thanks to @noloader. Until now -std=c++11
was set in Makefile
. The
important info is in above mentioned thread on the Newlib mailing
list. Yaakov Selkowitz wrote:
G++ defines _GNU_SOURCE
on glibc targets, meaning that -std=c++NN
is, contrary to the documentation, not strict ISO C++:
因此,应用 patch #987
AND 设置 -std=gnu++11
对我有用。我
没有尝试其他 -D
选项(我认为其他事实更多
基本的)。总结一下,@randombit 请应用 PR #987 并设置
-std=gnu++11
适用于 Cygwin 下的 gcc。
我们在 Newlib 下的 Cygwin 上使用 sigemptyset
时捕获编译器错误。该错误发生在 C++ 编译器中,但仅在使用 -std=XXX
时才会发生。没有标准选项,测试程序按预期编译和执行。
下面是测试程序,后面是感兴趣的Cygwinheader。我在 Cygwin header.
中没有发现任何可疑之处我尝试过 #define _GNU_SOURCE
和 #define _XOPEN_SOURCE 700
等技巧。我还尝试过使用全局和 std
命名空间等技巧。相关见What does -D_XOPEN_SOURCE do/mean? and 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);
^
该函数是对 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 does not compile under Cygwin 2.8.0 with g++ 5.4.0 解决。这是感兴趣的两个评论。
首先,来自noloader:
Cygwin uses Newlib, not GNU's
libstdc++
. When there's no-std=c++XX
, current GCC defaults to-std=gnu++11
(GCC 6 changes tognu++14
by default). I believe GNU sources ensures expected functions, likesigaction
, are available.You might consider trying
-D_XOPEN_SOURCE=600
or-D_XOPEN_SOURCE=700
.Also see C++ and feature guards Warning Question on the Newlib mailing list.
其次,来自SideChannel:
Thanks to @noloader. Until now
-std=c++11
was set inMakefile
. The important info is in above mentioned thread on the Newlib mailing list. Yaakov Selkowitz wrote:G++ defines
_GNU_SOURCE
on glibc targets, meaning that-std=c++NN
is, contrary to the documentation, not strict ISO C++:因此,应用 patch #987 AND 设置
-std=gnu++11
对我有用。我 没有尝试其他-D
选项(我认为其他事实更多 基本的)。总结一下,@randombit 请应用 PR #987 并设置-std=gnu++11
适用于 Cygwin 下的 gcc。