수색…
소개
C ++로 작성된 프로그램은 실행하기 전에 컴파일해야합니다. 운영 체제에 따라 다양한 컴파일러를 사용할 수 있습니다.
비고
대부분의 운영 체제는 컴파일러없이 제공되며 나중에 설치해야합니다. 일반적인 컴파일러 선택은 다음과 같습니다.
- GCC, GNU 컴파일러 모음 g ++
- clang : LLVM clang ++에 대한 C 언어 패밀리 프론트 엔드
- MSVC, Microsoft Visual C ++ (Visual Studio에 포함) visual-c ++
- C ++ Builder, Embarcadero C ++ Builder (RAD Studio에 포함) 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++14
및 c++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::thread
및 std::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\VC
의 VC
하위 디렉토리 ( x
는 버전 번호 (2010의 경우 10.0
또는 2015의 경우 14.0
))와 VCVARSALL
배치 파일을 명령 줄 매개 변수는 여기에 지정 됩니다 .
GCC와는 달리 Visual Studio는 컴파일러 ( cl.exe
)를 통해 링커 ( link.exe
)의 프론트 엔드를 제공하지는 않지만 컴파일러가 종료 될 때 호출하는 별도의 프로그램으로 링커를 제공합니다. cl.exe
및 link.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
- Visual Studio Community 2015 다운로드 및 설치
- Visual Studio 커뮤니티 열기
- 파일 -> 새로 만들기 -> 프로젝트를 클릭하십시오.
- 템플릿 -> Visual C ++ -> Win32 콘솔 응용 프로그램을 클릭 한 다음 프로젝트 이름을 MyFirstProgram으로 지정합니다.
- 확인을 클릭하십시오.
- 다음 창에서 다음을 클릭하십시오.
-
Empty project
상자를Empty project
다음 마침을 클릭하십시오. - 원본 파일 폴더를 마우스 오른쪽 단추로 클릭 한 다음 -> 추가 -> 새 항목 :
- C ++ File을 선택하고 main.cpp 파일의 이름을 지정한 다음 Add를 클릭하십시오 : 10 : 다음 코드를 복사하여 main.cpp 새 파일에 붙여 넣습니다.
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
return 0;
}
- 디버그 -> 디버깅 하지 않고 시작을 클릭하십시오 (또는 ctrl + F5를 누르십시오).
Clang으로 컴파일하기
는 AS 연타의 프론트 엔드는 GCC와 호환되는 위해 설계를 통해 컴파일 할 수 있습니다 대부분의 프로그램 GCC는 당신이 교체 할 때 컴파일 g++
함으로써 clang++
빌드 스크립트. -std=version
을 지정하지 않으면 gnu11이 사용됩니다.
MSVC 에 익숙한 Windows 사용자는 cl.exe
를 clang-cl.exe
바꿀 수 있습니다. 기본적으로 clang은 설치된 MSVC의 가장 높은 버전과 호환되도록 시도합니다.
Visual Studio로 컴파일하는 경우 프로젝트 속성에서 Platform toolset
을 변경하여 clang-cl을 사용할 수 있습니다.
두 경우 모두 clang은 프런트 엔드를 통해서만 호환되지만 바이너리 호환 객체 파일을 생성하려고 시도합니다. clang-cl 사용자는 MSVC와의 호환성이 아직 완전하지 않음에 유의해야 합니다 .
clang 또는 clang-cl을 사용하려면 특정 Linux 배포판 또는 IDE와 함께 번들로 제공되는 기본 설치 (예 : Mac의 XCode)를 사용할 수 있습니다. 이 컴파일러의 다른 버전이나이 버전이 설치되어 있지 않은 플랫폼에서는 공식 다운로드 페이지 에서 다운로드 할 수 있습니다.
CMake를 사용하여 코드를 작성하는 경우 일반적으로 CC
및 CXX
환경 변수를 다음과 같이 설정하여 컴파일러를 전환 할 수 있습니다.
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 가지 주요 단계가 있습니다.
C ++ 사전 처리기는 C ++ 소스 코드 파일을 가져 와서 헤더 (#include), 매크로 (#define) 및 기타 사전 처리기 지시문을 처리합니다.
C ++ 전처리기에 의해 생성 된 확장 된 C ++ 소스 코드 파일은 플랫폼 용 어셈블리 언어로 컴파일됩니다.
컴파일러에 의해 생성 된 어셈블러 코드는 플랫폼 용 객체 코드로 어셈블됩니다.
어셈블러에서 생성 된 오브젝트 코드 파일이 함께 링크됩니다.
라이브러리 또는 실행 파일을 생성하는 데 사용되는 라이브러리 함수의 오브젝트 코드 파일
전처리
전처리 기는 #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 (그래픽 인터페이스)로 컴파일하기
Code :: Blocks를 다운로드하여 설치 하십시오 . Windows 사용자 인 경우 이름에
mingw
포함 된 파일을 선택하는 데주의하십시오. 다른 파일은 컴파일러를 설치하지 않습니다.Code :: Blocks를 열고 "Create a new project"를 클릭하십시오 :
"콘솔 응용 프로그램"을 선택하고 "이동"을 클릭하십시오 :
"다음"을 클릭하고 "C ++"을 선택한 다음 "다음"을 클릭하고 프로젝트 이름을 선택하고 저장할 폴더를 선택한 후 "다음"을 클릭 한 다음 "마침"을 클릭하십시오.
이제 코드를 편집하고 컴파일 할 수 있습니다. "Hello world!"를 출력하는 기본 코드. 콘솔에 이미 있습니다. 프로그램을 컴파일 및 / 또는 실행하려면 도구 모음에있는 3 개의 컴파일 / 실행 버튼 중 하나를 누릅니다.
실행하지 않고 컴파일하려면 , 다시 컴파일하지 않고 실행하려면 컴파일하고 실행하려면 .
기본 "Hello world!"컴파일 및 실행 코드는 다음 결과를 제공합니다.