我们在使用Newlib下的Cygwin时,遇到了在使用
使用
sigemptyset
时出现编译错误的情况。该错误只在使用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);
^
<cygwin/signal.h>
以获取 Cygwin 信号头文件。 - Some programmer dudesigemptyset
时,有两个匹配项:(1)/usr/include/bash/sig.h
和(2)/usr/include/sys/signal.h
。 - jww<cygwin/signal.h>
,而是这是一个你需要查看的文件,用于处理Cygwin特定的事情。例如,在包含<signal.h>
之前需要定义哪些宏。 - Some programmer dude