수색…


소개

C ++로 작성된 프로그램은 실행하기 전에 컴파일해야합니다. 운영 체제에 따라 다양한 컴파일러를 사용할 수 있습니다.

비고

대부분의 운영 체제는 컴파일러없이 제공되며 나중에 설치해야합니다. 일반적인 컴파일러 선택은 다음과 같습니다.

C ++ 프로그램을 컴파일하는 방법에 대해서는 해당 컴파일러 설명서를 참조하십시오.

특정 컴파일러를 자체 빌드 시스템과 함께 사용하는 또 다른 옵션은 일반 컴파일러 시스템 이 특정 컴파일러 또는 기본 설치된 시스템 에 맞게 프로젝트를 구성하도록하는 것입니다.

GCC로 컴파일하기

main.cpp 라는 단일 소스 파일을 가정하면 최적화되지 않은 실행 파일을 컴파일하고 링크하는 명령은 다음과 같습니다 (최적화가없는 컴파일은 초기 개발 및 디버깅에 유용하지만 최신 GCC 버전에는 -Og 이 공식적으로 권장 됨).

g++ -o app -Wall main.cpp -O0

프로덕션 환경에서 사용하기 위해 최적화 된 실행 파일을 생성하려면 -O 옵션 중 하나를 사용하십시오 ( -O1 , -O2 , -O3 , -Os , -Ofast ).

g++ -o app -Wall -O2 main.cpp

-O 옵션을 생략하면 -O0이 기본값없이 사용됩니다 (숫자없이 -O를 지정하면 -O1로 해석됩니다).

또는 O 그룹의 최적화 플래그 (또는 더 많은 실험 최적화)를 직접 사용하십시오. 다음 예제는 -O2 최적화와 함께 -O3 최적화 수준에서 하나의 플래그를 사용하여 빌드됩니다.

g++ -o app -Wall -O2 -ftree-partial-pre main.cpp

플랫폼 별 최적화 된 실행 파일을 생성하려면 (동일한 아키텍처의 시스템에서 프로덕션 환경에서 사용) 다음을 사용하십시오.

g++ -o app -Wall -O2 -march=native main.cpp

위의 두 가지 중 하나는 Windows에서는 .\app.exe ./app , Linux, Mac OS에서는 ./app 와 같이 실행할 수있는 바이너리 파일을 생성합니다.

-o 플래그도 건너 [수 있습니다. 이 경우 GCC는 Windows에서 a.exe 기본 출력을 만들고 Unix 계열 시스템에서 a.out 을 만듭니다. 링크하지 않고 파일을 컴파일하려면 -c 옵션을 사용하십시오.

g++ -o file.o -Wall -c file.cpp

그러면 file.o 라는 오브젝트 파일이 만들어 file.o 나중에 다른 파일과 링크하여 이진 파일을 생성 할 수 있습니다.

g++ -o app file.o otherfile.o

최적화 옵션에 대한 자세한 내용은 gcc.gnu.org 에서 확인할 수 있습니다. 특히 주목할 것은 -Og (디버깅 경험에 중점을 둔 최적화 - 표준 편집 - 컴파일 - 디버그주기에 권장) 및 -Ofast (엄격한 표준 준수를 무시한 최적화를 포함하여 모든 최적화)입니다.

-Wall 플래그는 많은 일반적인 오류에 대한 경고를 가능하게하며 항상 사용되어야합니다. 코드 품질을 향상시키기 위해 -Wextra-Wall-Wextra 의해 자동으로 활성화되지 않는 기타 경고 플래그를 사용하는 것이 좋습니다.

코드에서 특정 C ++ 표준을 예상하는 경우 -std= 플래그를 포함하여 사용할 표준을 지정하십시오. 지원되는 값은 ISO C ++ 표준의 각 버전에 대한 최종 결정의 해에 해당합니다. GCC 6.1.0부터 std= 플래그에 유효한 값은 c++98 / c++03 , c++11 , c++14c++17 / c++1z 입니다. 슬래시로 구분 된 값은 동일합니다.

g++ -std=c++11 <file>

GCC에는 -std= 플래그로 지정된 표준과 충돌 할 때 사용할 수없는 일부 컴파일러 관련 확장이 포함되어 있습니다. 모든 확장을 사용하도록 컴파일하려면 gnu++XX 값을 사용할 수 있습니다. 여기서 XX 는 위에 나열된 c++ 값에 사용 된 연도 중 하나입니다.

지정하지 않으면 기본 표준이 사용됩니다. 6.1.0 이전의 GCC 버전의 경우 기본값은 -std=gnu++03 . GCC 6.1.0 이상에서는 기본값이 -std=gnu++14 입니다.

GCC의 버그로 인해 std::threadstd::wait_for 와 같이 C ++ 11에서 소개 된 C ++ 표준 스레딩 기능을 지원하기 위해 GCC의 컴파일 및 링크시에 -pthread 플래그가 있어야합니다. 스레딩 기능을 사용할 때 생략하면 일부 플랫폼 에서는 경고 가 표시 되지 않지만 결과유효하지 않을 수 있습니다.

라이브러리와 연결 :

라이브러리 이름을 전달하려면 -l 옵션을 사용하십시오.

g++ main.cpp -lpcre2-8
#pcre2-8 is the PCRE2 library for 8bit code units (UTF-8)

라이브러리가 표준 라이브러리 경로에 없으면 경로를 -L 옵션과 함께 추가하십시오.

g++ main.cpp -L/my/custom/path/ -lmylib

여러 라이브러리를 함께 연결할 수 있습니다.

g++ main.cpp -lmylib1 -lmylib2 -lmylib3

한 라이브러리가 다른 라이브러리에 종속되어있는 경우 종속 라이브러리 독립 라이브러리 앞에 두십시오.

g++ main.cpp -lchild-lib -lbase-lib

또는 링커가 --start-group--end-group 통해 순서를 결정하게합니다 (참고 : 이것은 상당한 성능 비용 --end-group ).

g++ main.cpp -Wl,--start-group -lbase-lib -lchild-lib -Wl,--end-group

Visual C ++로 컴파일하기 (커맨드 라인)

GCC 또는 Clang에서 Visual Studio로 이동하는 프로그래머 또는 일반적으로 명령 줄에 익숙한 프로그래머의 경우 명령 줄뿐만 아니라 IDE에서 Visual C ++ 컴파일러를 사용할 수 있습니다.

Visual Studio의 명령 줄에서 코드를 컴파일하려면 먼저 명령 줄 환경을 설정해야합니다. 이 작업은 Visual Studio Command Prompt / Developer Command Prompt / x86 Native Tools Command Prompt / x64 Native Tools Command Prompt 또는 이와 유사한 방법 (Visual Studio 버전에서 제공)을 열거 나 명령 프롬프트에서 다음 위치로 이동하여 수행 할 수 있습니다. 컴파일러의 설치 디렉토리 (일반적으로 \Program Files (x86)\Microsoft Visual Studio x\VCVC 하위 디렉토리 ( x 는 버전 번호 (2010의 경우 10.0 또는 2015의 경우 14.0 ))와 VCVARSALL 배치 파일을 명령 줄 매개 변수는 여기에 지정 됩니다 .

GCC와는 달리 Visual Studio는 컴파일러 ( cl.exe )를 통해 링커 ( link.exe )의 프론트 엔드를 제공하지는 않지만 컴파일러가 종료 될 때 호출하는 별도의 프로그램으로 링커를 제공합니다. cl.exelink.exe 는 다른 파일 및 옵션과 함께 개별적으로 사용할 수 있으며 cl 은 두 작업이 함께 수행되는 경우 파일 및 옵션을 link 하도록 전달할 수 있습니다. 에 지정된 연결 옵션 cl 옵션으로 변환됩니다 link , 그리고에 의해 처리되지 않은 파일 cl 직접 전달 될 것입니다 link . 이것은 주로 Visual Studio 명령 줄을 사용하여 컴파일하는 간단한 지침이므로 link 인수는 현재 설명되지 않습니다. 목록이 필요하면 여기를 참조 하십시오 .

cl 대한 인수는 대소 문자를 구별하며, link 할 인수는 그렇지 않습니다.

[다음 예제 중 일부는 절대 경로 이름을 지정할 때 Windows 셸 "현재 디렉터리"변수 %cd% 사용하는 것이 좋습니다. 이 변수에 익숙하지 않은 사용자는 현재 작업 디렉토리로 확장됩니다. 명령 줄에서 cl 을 실행할 때 사용한 디렉토리이며 기본적으로 명령 프롬프트에 지정됩니다 (예 C:\src> 명령 프롬프트가 C:\src> 인 경우 %cd%C:\src\ ).]


현재 폴더에서 main.cpp 라는 단일 소스 파일을 가정하면 최적화되지 않은 실행 파일을 컴파일하고 링크하는 명령 (초기 개발 및 디버깅에 유용함)은 다음 중 하나를 사용합니다.

cl main.cpp
// Generates object file "main.obj".
// Performs linking with "main.obj".
// Generates executable "main.exe".

cl /Od main.cpp
// Same as above.
// "/Od" is the "Optimisation: disabled" option, and is the default when no /O is specified.

동일한 디렉토리에 추가 소스 파일 "niam.cpp"가 있다고 가정하고 다음을 사용하십시오.

cl main.cpp niam.cpp
// Generates object files "main.obj" and "niam.obj".
// Performs linking with "main.obj" and "niam.obj".
// Generates executable "main.exe".

또한 예상대로 와일드 카드를 사용할 수 있습니다.

cl main.cpp src\*.cpp
// Generates object file "main.obj", plus one object file for each ".cpp" file in folder
//  "%cd%\src".
// Performs linking with "main.obj", and every additional object file generated.
// All object files will be in the current folder.
// Generates executable "main.exe".

실행 파일의 이름을 바꾸거나 재배치하려면 다음 중 하나를 사용하십시오.

cl /o name main.cpp
// Generates executable named "name.exe".

cl /o folder\ main.cpp
// Generates executable named "main.exe", in folder "%cd%\folder".

cl /o folder\name main.cpp
// Generates executable named "name.exe", in folder "%cd%\folder".

cl /Fename main.cpp
// Same as "/o name".

cl /Fefolder\ main.cpp
// Same as "/o folder\".

cl /Fefolder\name main.cpp
// Same as "/o folder\name".

/o/Fe 둘 다 필요에 따라 "name" o-param 적절한 확장자 (일반적으로 .exe 또는 .dll )를 추가하고 /OUT:o-param 으로 link 하기 위해 매개 변수 ( o-param 이라고 부름)를 전달합니다. /o/Fe 는 기능면에서 모두 똑같은 지식을 갖고 있지만 Visual Studio에서는 후자를 선호합니다. /o 는 더 이상 사용되지 않는 것으로 표시되어 있으며 주로 GCC 또는 Clang에 익숙한 프로그래머에게 제공되는 것으로 보입니다.

사이의 공간 중에 있습니다 /o 지정된 폴더 및 / 또는 이름은 선택 사항이며, 사이에 공백이있을 수 없습니다 /Fe 지정된 폴더 및 / 또는 이름.


마찬가지로 프로덕션 환경에서 사용하기 위해 최적화 된 실행 파일을 생성하려면 다음을 사용하십시오.

cl /O1 main.cpp
// Optimise for executable size.  Produces small programs, at the possible expense of slower
//  execution.

cl /O2 main.cpp
// Optimise for execution speed.  Produces fast programs, at the possible expense of larger
//  file size.

cl /GL main.cpp other.cpp
// Generates special object files used for whole-program optimisation, which allows CL to
//  take every module (translation unit) into consideration during optimisation.
// Passes the option "/LTCG" (Link-Time Code Generation) to LINK, telling it to call CL during
//  the linking phase to perform additional optimisations.  If linking is not performed at this
//  time, the generated object files should be linked with "/LTCG".
// Can be used with other CL optimisation options.

마지막으로 플랫폼 별 최적화 된 실행 파일 (지정된 아키텍처의 시스템에서 프로덕션 환경에서 사용)을 생성하려면 대상 플랫폼에 적절한 명령 프롬프트 또는 VCVARSALL 매개 변수 를 선택하십시오. link 는 객체 파일에서 원하는 플랫폼을 감지해야합니다. 그렇지 않으면 /MACHINE 옵션 을 사용하여 명시 적으로 대상 플랫폼을 지정하십시오.

// If compiling for x64, and LINK doesn't automatically detect target platform:
cl main.cpp /link /machine:X64

위의 파일 중 하나라도 /o 또는 /Fe 또는 컴파일러에 지정된 첫 번째 소스 또는 개체 파일과 동일한 이름을 제공하지 않으면 실행 파일이 생성됩니다.

cl a.cpp b.cpp c.cpp
// Generates "a.exe".

cl d.obj a.cpp q.cpp
// Generates "d.exe".

cl y.lib n.cpp o.obj
// Generates "n.exe".

cl /o yo zp.obj pz.cpp
// Generates "yo.exe".

링크하지 않고 파일을 컴파일하려면 다음을 사용하십시오.

cl /c main.cpp
// Generates object file "main.obj".

이것은 link 를 호출하지 않고 종료하도록 cl 에 지시하고 나중에 다른 파일과 링크하여 오브젝트 파일을 생성 할 수있는 오브젝트 파일을 생성합니다.

cl main.obj niam.cpp
// Generates object file "niam.obj".
// Performs linking with "main.obj" and "niam.obj".
// Generates executable "main.exe".

link main.obj niam.obj
// Performs linking with "main.obj" and "niam.obj".
// Generates executable "main.exe".

다른 유용한 명령 줄 매개 변수도 있습니다. 사용자가 알기에 매우 유용합니다.

cl /EHsc main.cpp
// "/EHsc" specifies that only standard C++ ("synchronous") exceptions will be caught,
//  and `extern "C"` functions will not throw exceptions.
// This is recommended when writing portable, platform-independent code.

cl /clr main.cpp
// "/clr" specifies that the code should be compiled to use the common language runtime,
//  the .NET Framework's virtual machine.
// Enables the use of Microsoft's C++/CLI language in addition to standard ("native") C++,
//  and creates an executable that requires .NET to run.

cl /Za main.cpp
// "/Za" specifies that Microsoft extensions should be disabled, and code should be
//  compiled strictly according to ISO C++ specifications.
// This is recommended for guaranteeing portability.

cl /Zi main.cpp
// "/Zi" generates a program database (PDB) file for use when debugging a program, without
//  affecting optimisation specifications, and passes the option "/DEBUG" to LINK.

cl /LD dll.cpp
// "/LD" tells CL to configure LINK to generate a DLL instead of an executable.
// LINK will output a DLL, in addition to an LIB and EXP file for use when linking.
// To use the DLL in other programs, pass its associated LIB to CL or LINK when compiling those
//  programs.

cl main.cpp /link /LINKER_OPTION
// "/link" passes everything following it directly to LINK, without parsing it in any way.
// Replace "/LINKER_OPTION" with any desired LINK option(s).

* nix 시스템 및 / 또는 GCC / Clang에 익숙한 사용자의 경우 cl , link 및 기타 Visual Studio 명령 줄 도구는 슬래시 (예 : /c ) 대신 하이픈 (예 : -c )으로 지정된 매개 변수를 사용할 수 있습니다. 또한 Windows는 슬래시 또는 백 슬래시를 유효한 경로 구분 기호로 인식하므로 * nix 스타일 경로도 사용할 수 있습니다. 이렇게하면 간단한 컴파일러 명령 행을 g++ 또는 clang++ 에서 cl 로 또는 그 반대로 쉽게 변환 할 수 있습니다.

g++ -o app src/main.cpp
cl  -o app src/main.cpp

물론 더 복잡한 g++ 또는 clang++ 옵션을 사용하는 명령 줄을 이식 할 때는 해당 컴파일러 문서 및 / 또는 자원 사이트에서 동일한 명령을 찾아야하지만,이를 통해 최소한의 시간만으로 시작할 수 있습니다. 새로운 컴파일러.

코드에 특정 언어 기능이 필요한 경우 특정 릴리스의 MSVC가 필요합니다. Visual C ++ 2015 Update 3 에서 /std 플래그를 사용하여 컴파일 할 표준 버전을 선택할 수 있습니다. 가능한 값은 /std:c++14/std:c++latest ( /std:c++17 곧 출시 될 예정)입니다.

참고 :이 컴파일러의 이전 버전에서는 특정 기능 플래그를 사용할 수 있었지만 대부분이 새로운 기능의 미리보기에 사용되었습니다.

Visual Studio (그래픽 인터페이스)로 컴파일 - Hello World

  1. Visual Studio Community 2015 다운로드 및 설치
  2. Visual Studio 커뮤니티 열기
  3. 파일 -> 새로 만들기 -> 프로젝트를 클릭하십시오. 여기에 이미지 설명을 입력하십시오.
  4. 템플릿 -> Visual C ++ -> Win32 콘솔 응용 프로그램을 클릭 한 다음 프로젝트 이름을 MyFirstProgram으로 지정합니다. 여기에 이미지 설명을 입력하십시오.
  5. 확인을 클릭하십시오.
  6. 다음 창에서 다음을 클릭하십시오. 여기에 이미지 설명을 입력하십시오.
  7. Empty project 상자를 Empty project 다음 마침을 클릭하십시오. 여기에 이미지 설명을 입력하십시오.
  8. 원본 파일 폴더를 마우스 오른쪽 단추로 클릭 한 다음 -> 추가 -> 새 항목 : 여기에 이미지 설명을 입력하십시오.
  9. C ++ File을 선택하고 main.cpp 파일의 이름을 지정한 다음 Add를 클릭하십시오 : 여기에 이미지 설명을 입력하십시오. 10 : 다음 코드를 복사하여 main.cpp 새 파일에 붙여 넣습니다.
#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
    return 0;
}

환경은 다음과 같아야합니다. 여기에 이미지 설명을 입력하십시오.

  1. 디버그 -> 디버깅 하지 않고 시작을 클릭하십시오 (또는 ctrl + F5를 누르십시오).

여기에 이미지 설명을 입력하십시오.

  1. 끝난. 다음 콘솔 출력을 얻어야합니다. 여기에 이미지 설명을 입력하십시오.

Clang으로 컴파일하기

는 AS 연타의 프론트 엔드는 GCC와 호환되는 위해 설계를 통해 컴파일 할 수 있습니다 대부분의 프로그램 GCC는 당신이 교체 할 때 컴파일 g++ 함으로써 clang++ 빌드 스크립트. -std=version 을 지정하지 않으면 gnu11이 사용됩니다.

MSVC 에 익숙한 Windows 사용자는 cl.execlang-cl.exe 바꿀 수 있습니다. 기본적으로 clang은 설치된 MSVC의 가장 높은 버전과 호환되도록 시도합니다.

Visual Studio로 컴파일하는 경우 프로젝트 속성에서 Platform toolset 을 변경하여 clang-cl을 사용할 수 있습니다.

두 경우 모두 clang은 프런트 엔드를 통해서만 호환되지만 바이너리 호환 객체 파일을 생성하려고 시도합니다. clang-cl 사용자는 MSVC와의 호환성이 아직 완전하지 않음에 유의해야 합니다 .

clang 또는 clang-cl을 사용하려면 특정 Linux 배포판 또는 IDE와 함께 번들로 제공되는 기본 설치 (예 : Mac의 XCode)를 사용할 수 있습니다. 이 컴파일러의 다른 버전이나이 버전이 설치되어 있지 않은 플랫폼에서는 공식 다운로드 페이지 에서 다운로드 할 수 있습니다.

CMake를 사용하여 코드를 작성하는 경우 일반적으로 CCCXX 환경 변수를 다음과 같이 설정하여 컴파일러를 전환 할 수 있습니다.

mkdir build
cd build
CC=clang CXX=clang++ cmake ..
cmake --build .

Cmake에 대한 소개 도 참조하십시오.

온라인 컴파일러

다양한 웹 사이트에서 C ++ 컴파일러에 대한 온라인 액세스를 제공합니다. 온라인 컴파일러의 기능 세트는 사이트마다 크게 다르지만 일반적으로 다음을 수행 할 수 있습니다.

  • 코드를 브라우저의 웹 양식에 붙여 넣습니다.
  • 일부 컴파일러 옵션을 선택하고 코드를 컴파일하십시오.
  • 컴파일러 및 / 또는 프로그램 출력을 수집하십시오.

온라인 컴파일러 웹 사이트 동작은 일반적으로 누군가가 컴파일러를 실행하고 서버 측에서 임의의 코드를 실행할 수 있도록 허용하기 때문에 매우 제한적입니다. 일반적으로 원격 임의 코드 실행은 취약성으로 간주됩니다.

온라인 컴파일러는 다음과 같은 목적에 유용 할 수 있습니다.

  • C ++ 컴파일러가없는 컴퓨터 (스마트 폰, 태블릿 등)에서 작은 코드 스 니펫을 실행하십시오.
  • 코드가 다른 컴파일러로 성공적으로 컴파일되고 컴파일 된 컴파일러와 관계없이 동일한 방법으로 실행되는지 확인합니다.
  • C ++의 기초를 배우거나 가르칩니다.
  • 최신 C ++ 컴파일러를 로컬 시스템에서 사용할 수없는 경우 최신 C ++ 기능 (가까운 미래에 C ++ 14 및 C ++ 17)을 학습하십시오.
  • 다른 컴파일러와 비교하여 컴파일러에서 버그를 발견합니다. 시스템에서 사용할 수없는 컴파일러 버그가 다음 버전에서 수정되었는지 확인하십시오.
  • 온라인 판사 문제를 해결하십시오.

온라인 어떤 컴파일러를 사용하지 않아야합니다 :

  • C ++을 사용하여 모든 기능을 갖춘 (심지어 작은) 응용 프로그램을 개발하십시오. 일반적으로 온라인 컴파일러는 타사 라이브러리와 연결하거나 빌드 아티팩트를 다운로드하는 것을 허용하지 않습니다.
  • 집중적 인 계산을 수행하십시오. 서버 측 컴퓨팅 리소스는 제한적이므로 모든 사용자 제공 프로그램은 몇 초간 실행하면 종료됩니다. 허용 된 실행 시간은 일반적으로 테스트 및 학습을 위해 충분합니다.
  • 컴파일러 서버 자체 또는 그물에있는 제 3 자 호스트를 공격하십시오.

예 :

면책 조항 : 문서 작성자는 아래 나열된 리소스와 관련이 없습니다. 웹 사이트는 사전 순으로 나열됩니다.

  • http://codepad.org/ 코드 공유가 가능한 온라인 컴파일러. 소스 코드 경고 또는 오류로 컴파일 한 후 코드 편집이 잘되지 않습니다.
  • http://coliru.stacked-crooked.com/ 명령 행을 지정하는 온라인 컴파일러. 사용을 위해 GCC와 Clang 컴파일러를 제공합니다.
  • http://cpp.sh/ - C ++ 14를 지원하는 온라인 컴파일러. 컴파일러 명령 행을 편집 할 수 없지만 일부 옵션은 GUI 제어를 통해 사용할 수 있습니다.
  • https://gcc.godbolt.org/ - 다양한 컴파일러 버전, 아키텍처 및 디스 어셈블리 출력 목록을 제공합니다. 다른 컴파일러가 코드를 컴파일 할 때 검사해야 할 때 매우 유용합니다. ARM, ARMv8 (ARM64와 같은), Atmel AVR, MIPS, MIPS64, MSP430, PowerPC 용으로 사용할 수있는 이러한 컴파일러 중 하나 이상이 포함 된 GCC, Clang, MSVC ( CL ), Intel 컴파일러 ( icc ), ELLCC 및 Zapcc가 제공됩니다. , x86 및 x64 아키텍처를 지원합니다. 컴파일러 명령 행 인수를 편집 할 수 있습니다.
  • https://ideone.com/ - 코드 스 니펫 동작을 설명하기 위해 인터넷에서 널리 사용됩니다. 사용을 위해 GCC와 Clang을 모두 제공하지만 컴파일러 명령 행을 편집 할 수는 없습니다.
  • http://melpon.org/wandbox - 수많은 Clang 및 GNU / GCC 컴파일러 버전을 지원합니다.
  • http://onlinegdb.com/ - 편집기, 컴파일러 (gcc) 및 디버거 (gdb)가 포함 된 매우 단순한 IDE입니다.
  • http://rextester.com/ - Boost 라이브러리를 사용할 수있는 C 및 C ++ 용 Clang, GCC 및 Visual Studio 컴파일러 (다른 언어 용 컴파일러와 함께)를 제공합니다.
  • http://tutorialspoint.com/compile_cpp11_online.php - GCC 및 사용자 친화적 인 프로젝트 탐색기가 포함 된 모든 기능을 갖춘 UNIX 쉘.
  • http://webcompiler.cloudapp.net/ - RiSE4fun의 일부로 Microsoft에서 제공하는 온라인 Visual Studio 2015 컴파일러.

C ++ 컴파일 프로세스

C ++ 프로그램을 개발할 때 다음 단계는 프로그램을 실행하기 전에 컴파일하는 것입니다. 컴파일은 C, C ++ 등 사람이 읽을 수있는 언어로 작성된 프로그램을 중앙 처리 장치 (Central Processing Unit)가 직접 이해하는 기계어 코드로 변환하는 프로세스입니다. 예를 들어, prog.cpp라는 C ++ 소스 코드 파일이 있고 컴파일 명령을 실행하면,

   g++ -Wall -ansi -o prog prog.cpp

소스 파일에서 실행 파일을 만드는 과정에는 4 가지 주요 단계가 있습니다.

  1. C ++ 사전 처리기는 C ++ 소스 코드 파일을 가져 와서 헤더 (#include), 매크로 (#define) 및 기타 사전 처리기 지시문을 처리합니다.

  2. C ++ 전처리기에 의해 생성 된 확장 된 C ++ 소스 코드 파일은 플랫폼 용 어셈블리 언어로 컴파일됩니다.

  3. 컴파일러에 의해 생성 된 어셈블러 코드는 플랫폼 용 객체 코드로 어셈블됩니다.

  4. 어셈블러에서 생성 된 오브젝트 코드 파일이 함께 링크됩니다.
    라이브러리 또는 실행 파일을 생성하는 데 사용되는 라이브러리 함수의 오브젝트 코드 파일

전처리

전처리 기는 #include 및 #define과 같은 전 처리기 지시문을 처리합니다. C ++의 구문에 대해 불가지론 적이며, 이것이 왜주의 깊게 사용해야하는지입니다.

#include 지시어를 각 파일의 내용 (대개 단지 선언)으로 대체하고, 매크로 (#define)를 대체하고, #if에 따라 텍스트의 다른 부분을 선택하여 한 번에 하나의 C ++ 소스 파일에서 작동합니다. #ifdef 및 #ifndef 지시어.

전 처리기는 사전 처리 토큰 스트림에서 작동합니다. 매크로 대체는 토큰을 다른 토큰으로 바꾸는 것으로 정의됩니다 (연산자 ##은 두 토큰이 합당한 경우 병합 할 수 있음).

이 모든 후, 전처리 기는 위에 설명 된 변환으로 인한 토큰 스트림 인 단일 출력을 생성합니다. 또한 각 행의 출처를 컴파일러에 알려주는 특수 마커를 추가하여 현명한 오류 메시지를 생성하는 데 사용할 수 있습니다.

이 단계에서는 #if 및 #error 지시어를 영리하게 사용하여 오류를 생성 할 수 있습니다.

아래 컴파일러 플래그를 사용하여 전처리 단계에서 프로세스를 중지 할 수 있습니다.

g++ -E prog.cpp

편집

컴파일 단계는 전처리 기의 각 출력에서 ​​수행됩니다. 컴파일러는 순수 C ++ 소스 코드를 구문 분석하고 (이제 전 처리기 지시문없이) 어셈블리 코드로 변환합니다. 그런 다음 해당 코드를 어떤 형식 (ELF, COFF, a.out ...)의 실제 이진 파일을 생성하는 기계 코드로 어셈블하는 기본 백엔드 (툴체인의 어셈블러)를 호출합니다. 이 오브젝트 파일에는 입력에 정의 된 기호의 컴파일 된 코드 (바이너리 형식)가 들어 있습니다. 오브젝트 파일의 기호는 이름으로 참조됩니다.

오브젝트 파일은 정의되지 않은 기호를 참조 할 수 있습니다. 이것은 선언문을 사용하는 경우이며 정의를 제공하지 않습니다. 컴파일러는 이것을 신경 쓰지 않고 소스 코드가 올바른 형식이면 객체 파일을 행복하게 생성합니다.

컴파일러는 일반적으로이 시점에서 컴파일을 중지하도록합니다. 이는 각 소스 코드 파일을 개별적으로 컴파일 할 수 있기 때문에 매우 유용합니다. 이 기능이 제공하는 이점은 단일 파일 만 변경하는 경우 모든 것을 다시 컴파일 할 필요가 없다는 것입니다.

생성 된 오브젝트 파일은 나중에 쉽게 재사용 할 수 있도록 정적 라이브러리라는 특수 아카이브에 저장할 수 있습니다.

이 단계에서 구문 오류 또는 실패한 과부하 해결 오류와 같은 "일반"컴파일러 오류가보고됩니다.

컴파일 단계 후 프로세스를 중지하기 위해 -S 옵션을 사용할 수 있습니다.

g++ -Wall -ansi -S prog.cpp

조립

어셈블러는 객체 코드를 만듭니다. UNIX 시스템에서는 .o 접미어 (MSDOS에서 .OBJ)가있는 파일을보고 오브젝트 코드 파일을 나타낼 수 있습니다. 이 단계에서 어셈블러는 해당 오브젝트 파일을 어셈블리 코드에서 기계 수준 명령어로 변환하며 생성 된 파일은 재배치 가능한 객체 코드입니다. 따라서 컴파일 단계에서는 재배치 가능 객체 프로그램이 생성되며이 프로그램은 다시 컴파일 할 필요없이 다른 위치에서 사용할 수 있습니다.

어셈블리 단계 후에 프로세스를 중지하려면 -c 옵션을 사용할 수 있습니다.

g++ -Wall -ansi -c prog.cpp

연결 중

링커는 어셈블러가 생성 한 객체 파일에서 최종 컴파일 출력을 생성합니다. 이 출력은 공유 (또는 동적) 라이브러리 (이름이 비슷하지만 앞에서 언급 한 정적 라이브러리와 거의 동일하지는 않지만) 또는 실행 파일 일 수 있습니다.

정의되지 않은 기호에 대한 참조를 올바른 주소로 바꾸면 모든 오브젝트 파일을 링크합니다. 이러한 심볼 각각은 다른 오브젝트 파일이나 라이브러리에 정의 될 수 있습니다. 표준 라이브러리가 아닌 다른 라이브러리에 정의되어 있으면 링커에 알려야합니다.

이 단계에서 가장 일반적인 오류는 누락 된 정의 또는 중복 된 정의입니다. 전자는 정의가 존재하지 않거나 (즉, 작성되지 않았 음) 또는 해당 객체 파일이나 라이브러리가 링커에 제공되지 않았 음을 의미합니다. 후자는 명백합니다 : 같은 심볼이 두 개의 서로 다른 오브젝트 파일이나 라이브러리에서 정의되었습니다.

Code :: Blocks (그래픽 인터페이스)로 컴파일하기

  1. Code :: Blocks를 다운로드하여 설치 하십시오 . Windows 사용자 인 경우 이름에 mingw 포함 된 파일을 선택하는 데주의하십시오. 다른 파일은 컴파일러를 설치하지 않습니다.

  2. Code :: Blocks를 열고 "Create a new project"를 클릭하십시오 :

    여기에 이미지 설명을 입력하십시오.

  3. "콘솔 응용 프로그램"을 선택하고 "이동"을 클릭하십시오 :

    여기에 이미지 설명을 입력하십시오.

  4. "다음"을 클릭하고 "C ++"을 선택한 다음 "다음"을 클릭하고 프로젝트 이름을 선택하고 저장할 폴더를 선택한 후 "다음"을 클릭 한 다음 "마침"을 클릭하십시오.

  5. 이제 코드를 편집하고 컴파일 할 수 있습니다. "Hello world!"를 출력하는 기본 코드. 콘솔에 이미 있습니다. 프로그램을 컴파일 및 / 또는 실행하려면 도구 모음에있는 3 개의 컴파일 / 실행 버튼 중 하나를 누릅니다.

    여기에 이미지 설명을 입력하십시오.

    실행하지 않고 컴파일하려면 짓다 , 다시 컴파일하지 않고 실행하려면 운영 컴파일하고 실행하려면 빌드 및 실행 .

    기본 "Hello world!"컴파일 및 실행 코드는 다음 결과를 제공합니다.

    여기에 이미지 설명을 입력하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow