2016-12-12 20 views
1

gcc -std=c++11を使ってCygwinでプログラムをコンパイルできないことがあります。ヘッダーはOKをコンパイルします(boost/asio.hppのように、定義が欠落していない限り)。さて、Cygwinの#ifdefマクロは、C++ 11環境でいくつかの関数定義をバイパスするので、プログラムはそうではないかもしれません。同じソースファイルがFedora Linuxで同様にコンパイルされている場合は、これは発生しません。gcc -std = C++ 11を使用しているときにCygwinでいくつかのシステム関数が定義されていないのはなぜですか?

このサンプルプログラムは、GCCを使用してコンパイルに失敗-std = C++ 11オプション:

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

私が最初に上記のプログラムをコンパイルしなかったことを発見することで、これを発生したが、その後、さらに多くの類似しました更新された標準を使用して既存のコードを再コンパイルするときの問題。

私が見つけたインクルードセクションは、返信に記載されています。 、あなたのソースコードで

他が含ま前

#define _GNU_SOURCE 

を含める:

+0

代わりに '-std = gnu ++ 11'を使用していないのはなぜですか? –

+0

ありがとう@MarkGlisse。私はドキュメントにある 'C++ 11'オプションを使用しました。私はあなたがそれを指摘するまで、新しい標準を指定する別の方法があることに気づいていませんでした(あなたの方法は良いですが、ブーストをアップグレードまたは再インストールしても問題は発生しません)。 – FNE

答えて

0

は、ここでは、Cygwinのまで使用することができます回避策のライブラリが更新されて含まれ、[。タイプミスを修正するために編集しました] 。この回避策はFedora Linuxでは必要ではなく、Cygwin環境でのみ使用し、-std = compilerオプションでのみ使用します。

これは修正されています。私が発見していない

#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

_GNU_SOURCEがデフォルトです。なぜ 'gcc -std = C++ 11'を使うのですか?またはCまたはC++ですが、私はC++標準でCのompilerを呼び出すことは理解できません。 – matzeri

+0

私は**実際には 'C++ -std = C++ 11'を使っていました。ただし、gcc、C++、g ++のいずれを使用しても同じエラーが発生します。あなたがgoogleの "gnu C++ compiler"の場合、gccが出てきます。これはC++コンパイラです。 – FNE

+0

/usr/bin/gccと/ usr/bin/g ++は、2つの異なる言語の2つの異なるコンパイラです。言語は関連していますが、同一ではないため、関連しています。 '-std = C++ 11'がなくてもテストしたかどうかはわかりません – matzeri

関連する問題