使用gcc -std = c ++ 11时,为什么Cygwin中的某些系统函数未定义?

问题描述 投票:1回答:2

程序无法使用gcc -std=c++11在Cygwin中编译。标头编译好(除非像boost / asio.hpp一样,他们尝试使用缺少的定义)。现在,因为Cygwin的#ifdef宏绕过了c ++ 11环境中的一些函数定义,所以程序可能不会。当在Fedora Linux上类似地编译相同的源文件时,不会发生这种情况。

此示例程序无法使用gcc -std = c ++ 11选项进行编译:

#include <boost/asio.hpp>
int main() { return 0; }

我第一次遇到这个问题是发现上面的程序没有编译,然后在使用更新的标准重新编译现有代码时发现了更多类似的问题。

回复中列出了我发现破坏的包含部分。

[编辑纠正错别字。]

c++11 gcc include cygwin system
2个回答
1
投票

这是在Cygwin包含库更新之前可以使用的解决方法:

在您的源代码中,包括

#define _GNU_SOURCE

在任何其他包括之前。 Fedora Linux中不需要此解决方法,仅在Cygwin环境中,然后仅使用-std =编译器选项。

这个修复:

#include <boost/asio.hpp> // (Because it uses sigfillset from sys/signal.h)
#include <sys/signal.h>   // sigfillset and others declared nearby
#include <sys/types.h>    // u_int and other __MISC_VISIBLE typedefs
#include <stdio.h>        // at least fileno
#include <string.h>       // at least strdup

可能还有其他一些我没有发现的故障。这也可以通过简单修改/usr/include/sys/features.h,添加来解决

#ifndef _GNU_SOURCE // LOCAL WORK-AROUND
#define _GNU_SOURCE
#endif

靠近文件的开头。虽然这适用于休闲图书馆用户,但它不是Cygwin开发人员将使用的方法。


0
投票

使用-std=gnu++11代替-std=c++11和Cygwin。

有了Cygwin我发现-std=c++11似乎排除了GNU扩展并导致Boost和POSIX标题出现各种问题。

© www.soinside.com 2019 - 2024. All rights reserved.