使用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中的某些系统函数未定义?的主要内容,如果未能解决你的问题,请参考以下文章
用于解释自定义 c++11 属性的 Clang/GCC 插件
c++11(或更低版本)中 gcc __attribute__((unused)) 的 Visual Studio 等效项?