g ++로 C ++ 11 컴파일


367

C ++ 컴파일러를 C ++ 11로 업데이트하려고합니다. 나는 비트를 검색하고 난 내가 플래그를 사용해야한다는 결론에 도달했다 -std=c++0x거나 -std=gnu++0x,하지만 난 플래그에 대한 많은 것들을 모른다. 누구든지 나를 도울 수 있습니까? (우분투 12.04를 사용하고 있습니다.)

다음은 C ++ 11 (예 : 배열)에 포함 된 라이브러리를 사용하려고 할 때 컴파일러에서 발생하는 오류입니다.

#include <array>
#include <iostream>

int main()
{
    std::array<int, 3> arr = {2, 3, 5};
    ...
}

이 파일에는 향후 ISO C ++ 표준 인 C ++ 0x에 대한 컴파일러 및 라이브러리 지원이 필요합니다. 이 지원은 현재 실험 중이며 -std = c ++ 0x 또는 -std = gnu ++ 0x 컴파일러 옵션으로 활성화해야합니다.


5
최신 버전에서는 아마도 -std=c++11대신 사용해야 합니다. 그래도 둘 다 허용됩니다.

6
이것은 많은 맥락을 그리워합니다. 시도한 전체 명령 (컴파일하려는 샘플 코드 일 수도 있음)과 실제로 실패한 항목을 표시하십시오.
KillianDS

4
@classdaknok_t : 둘 다 허용되어야합니다. 우분투 12.04도 g++-4.6기본적으로 제공 됩니다 (만 지원 -std=c++0x)
KillianDS

3
바로 뒤에 플래그를 추가하십시오 ( g++예 :) g++ -std=c++0x _filename_ && ./a.out.
n. '대명사'm.

1
이 게시물을 통해 제목 오류 메시지를 검색했습니다. QMAKE 프로젝트에서 일하고 있는데 솔루션은 CONFIG + = c ++ 11을 .pro 파일에 추가하는 것입니다.

답변:


529

플래그 (또는 컴파일러 옵션)는 컴파일러 실행 파일로 전달되는 일반적인 명령 줄 인수 일뿐입니다.

명령 행 (터미널)에서 g ++를 호출한다고 가정합니다.

$ g++ -std=c++11 your_file.cpp -o your_program

또는

$ g++ -std=c++0x your_file.cpp -o your_program

위의 방법으로 문제가 해결되지 않으면


8
-Wall -g바로 뒤에 두는 것을 잊지 마십시오g++
Basile Starynkevitch

7
@BasileStarynkevitch : -Werror프로젝트를 시작할 때도 이유가 없습니다.
Matthieu M.

3
더 나은 C ++ 11 지원은 논쟁의 여지가 더 나은 진단 (고대이다 GCC 4.2 사용 연타의 페이지를 설명하는) 요즘 훨씬 더 그렇게 보이지 않는 gcc.gnu.org/wiki/ClangDiagnosticsComparison )
조나단 Wakely

58
C ++ 컴파일러가 기본적으로 C ++ 11 표준을 지원하는지 여부, 즉 플래그가 없는지 아는 사람이 있습니까?
Dennis

2
그리고 아직 모르는 경우 Visual C ++에서 VC11 (Visual Studio 2012) 이상을 사용하여 C ++ 11 기능을 사용하십시오
gerrytan

44

g++명령으로 확인할 수 있습니다 .

which g++
g++ --version

이것은 현재 어떤 컴파일러가 가리키는 지 알려줍니다.

g++4.7로 전환하려면 (시스템에 설치했다고 가정) 다음을 실행하십시오.

sudo update-alternatives --config gcc

There are 2 choices for the alternative gcc (providing /usr/bin/gcc).

  Selection    Path              Priority   Status
------------------------------------------------------------
  0            /usr/bin/gcc-4.6   60        auto mode
  1            /usr/bin/gcc-4.6   60        manual mode
* 2            /usr/bin/gcc-4.7   40        manual mode

그런 다음 선택 항목 2으로 선택하십시오 (내 기계는 이미 g++4.7을 가리 키 므로 *).

컴파일러를 전환 한 후 다시 실행 g++ --version하여 전환이 올바르게 수행되었는지 확인하십시오.

이제 프로그램을 컴파일하십시오

g++ -std=c++11 your_file.cpp -o main

g ++ 4.4와 같은 버전은 너무 오래되어 일부 기능을 수행하기 어려울 수 있으므로 업그레이드가 필요합니다. 업그레이드는 시스템에 따라 다르며 g ++를 직접 컴파일하고 시스템 컴파일러를 참조 용으로 대체하는 방법은 피합니다.
Colin D

13

우분투에는 확실히 최신 버전의 g ++이 있습니다. 사용할 플래그는 -std=c++0x입니다.


그가 우분투를 사용하고 있다고 어떻게 말할 수 있습니까? 궁금 해서요
Shravan40

22
I'm using Ubuntu 12.04.질문에 @ Shravan40 OP가 명시 적으로 말합니다 .
Timothy Gu

10

GNU 컴파일러 확장을 유지하려면 -std = c ++ 0x 대신 -std = gnu ++ 0x를 사용하십시오. 맨 페이지에서 인용 한 내용은 다음과 같습니다.

컴파일러는 c89 또는 c ++ 98과 같은 몇 가지 기본 표준과 gnu89 또는 gnu ++ 98과 같은 표준의 GNU 방언을 수용 할 수 있습니다. 기본 표준을 지정하면 컴파일러는 해당 표준을 따르지 않는 GNU 확장명을 사용하는 프로그램과 해당 표준을 따르는 모든 프로그램을 수락합니다. 예를 들어, -std = c89는 "asm"및 "typeof"키워드와 같이 ISO C90과 호환되지 않는 GCC의 특정 기능을 해제하지만 생략과 같이 ISO C90에서 의미가없는 다른 GNU 확장은 해제합니다. "? :"표현식의 중간 용어. 반면에 표준의 GNU 방언을 지정하면 컴파일러가 지원하는 모든 기능이 기본 표준의 의미를 변경하고 일부 엄격한 프로그램이 거부 될 수있는 경우에도 컴파일러가 지원하는 모든 기능이 활성화됩니다. 특정 표준은 -pedantic에서 표준의 해당 버전이 제공된 GNU 확장 기능을 식별하는 데 사용됩니다. 예를 들어 -std = gnu89 -pedantic은 C ++ 스타일 // 주석에 대해 경고하지만 -std = gnu99 -pedantic은 경고하지 않습니다.


그리고 바이너리 ?:연산자를 제외하고는 무엇을 얻 습니까? 염두에 두어야 할 다른 확장 인 구조 표현식은 C ++ 11 목록 초기화로 대체됩니다. 어쨌든이 인용문은 주로 C ++이 아닌 C와 관련이 있습니다.
Potatoswatter

9

특정 버전의 컴파일러에서 지원되는 기능에 대한 다음 링크 를 참조 할 수 있습니다 . 컴파일러의 기능 지원에 대한 전체 목록이 있습니다. GCC는 표준을 엄격하게 따르고 다른 컴파일러보다 먼저 구현됩니다.

귀하의 질문에 관해서는 다음을 사용하여 컴파일 할 수 있습니다

  1. g++ -std=c++11 C ++ 11 용
  2. g++ -std=c++14 C ++ 14 용
  3. g++ -std=c++17 C ++ 17 용
  4. g++ -std=c++2aC ++ 20의 모든 기능이 아직 지원되지는 않지만 GCC의 기능 지원 목록 은이 링크 를 참조하십시오 .

특정 기능이 지원되기를 기다리는 경우 목록이 매우 빠르게 변경되어 목록을 주시하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.