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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用gcc -std = c ++ 11时,为什么Cygwin中的某些系统函数未定义?相关的知识,希望对你有一定的参考价值。

程序无法使用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; }

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

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

[编辑纠正错别字。]

答案

这是在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开发人员将使用的方法。

另一答案

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

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

以上是关于使用gcc -std = c ++ 11时,为什么Cygwin中的某些系统函数未定义?的主要内容,如果未能解决你的问题,请参考以下文章

升级 GCC 支持C++11

使用系统 gcc 命令从另一个运行 c 程序

用于解释自定义 c++11 属性的 Clang/GCC 插件

如何在 C++11 中创建结构的编译时常量实例

c++11(或更低版本)中 gcc __attribute__((unused)) 的 Visual Studio 等效项?

Linux From Scratch(LFS11.0)构建 LFS 系统 - GCC-11.2.0