2016-12-12 4 views
1

gcc -std=c++11을 사용하여 Cygwin에서 프로그램을 컴파일 할 수 없습니다. 헤더는 boost/asio.hpp처럼 누락 된 정의를 사용하려고 시도하지 않는 한 OK를 컴파일합니다. 이제 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 ++는 두 개의 다른 언어에 대한 두 개의 다른 컴파일러입니다. 언어는 관련되어 있지만 동일하지는 않기 때문에 관련이 있습니다. '-std = C++ 11'없이 테스트했는지 아닌지는 분명치 않습니다. – matzeri