비주얼 스튜디오 툴에서 컴파일하여 사용하기 불편하여 vscode나 다른 툴을 이용하여 코딩 작업을 합니다. 비주얼 스튜디오의 경우에는 마우스로 일련의 작업들이 진행되기에 키보드로만 작업을 주로 하시는 분들은 불편함을 느낄수 있습니다. 그런 사용자들을 위해 cl 이라는 명령어로 컴파일이 가능한 방법을 설명하려 합니다.
cl 컴파일러
cl.exe 란
명령어를 사용하여 작성 된 소스를 컴파일하는 비주얼 스튜디오 컴파일러.
본인이 설치 된 Visual Studio 폴더로 이동하여 Command Prompt 창을 열어 봅니다.
창을 열고 cl 명령어를 쳐서 버전과 동작 가능한지 확인 합니다. 현재 x86 용 19.29 버전이 설치 되어 있습니다.
cl /? 를 입력 하면 사용 방법을 확인할 수 있습니다. 내용이 많아 페이지 넘기면서 확인해야 합니다.
where cl 명령어를 쳐서 cl 이 어디에 있는지 확인해 봅니다. 다른 곳에서 이 명령어를 사용하기 위해서는 이 위치를 PATH 에 입력하거나 사용시 절대경로를 입력하여 사용해야 합니다.
비주얼 스튜디오 옵션 정리
cl 옵션을 사용하기 위해 비주얼 스튜디오에서 기본 컴파일 옵션을 확인해 보자. 엄청 많으나 기본적인것만 추려서 확인해 적용 하면 된다. 한번 봐두면 나중에 아 이런식이였구나 생각하기 위해 정리해 둔다.
/permissive- /ifcOutput "Release\" /GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"Release\vc142.pdb" /Zc:inline /fp:precise /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MD /FC /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\hello.pch" /diagnostics:column
- 비주얼 스튜디오 옵션 설명
옵션 | 설명 | 추가 설명 |
/permissive- | /permissive[-] 몇몇 일치하지 않는 코드를 사용하도록 설정하여 컴파일합니다(기능 집합은 변경될 수 있음) (기본적으로 설정). |
기본설정으로 안해도 상관 없음 |
/ifcOutput | 결과 파일 위치 | cl 에서는 사용 안함. |
/GS | 보안 검사를 사용합니다. | 버퍼 보안 검사 |
/GL | 전체 프로그램 최적화를 사용합니다. | cl에서는 링크 타임 코드 생성 사용 |
/analzye | 코드 분석 및 제어 옵션을 사용합니다. | 네이티브 분석을 사용하도록 설정 |
/W3 | /W3 는 수준 1, 수준 2 및 수준 3 (생산 품질) 경고를 표시 합니다. /W3 는 IDE의 기본 설정입니다. | /W<n> 같은 형태로 경고 수준 사용 |
/Gy | 함수 수준 링크 사용 | 링커 분리 함수를 사용 |
/Zc:wchar_t | wchar_t를 네이티브 형식으로 인식 | C/C++ 언어 규칙이며 여러 인수를 사용하여 적용 |
/Zi | 디버거와 함께 사용할 모든 기호 디버깅 정보를 포함하는 별도의 PDB 파일을 생성 | 디버깅 정보를 사용 |
/Gm- | 최소 다시 빌드 사용 | 다시 컴파일해야 할지 여부를 결정하는 최소 다시 빌드가 가능하도록 설정 |
/O2 | 속도 최대화 | 최대 최적화(속도 우선) |
/sdl | 추가 보안 검사 사용 | 일부 경고를 오류로 활성화 |
/Fd | "Release\vc142.pdb" 프로그램 데이터베이스 파일 이름 | <파일> .PDB 파일의 이름을 지정 |
/Zc:inline | 참조되지 않은 COMDAT 제거 | 유추되지 않은 데이터 또는 함수를 제거 |
/fp:precise |
부동 소수점 동작 지정 | 대상 컴퓨터에 대한 개체 코드를 생성하고 최적화할 때 부동 소수점 코드의 소스 식 순서 지정 및 반올림 속성을 유지, 결과를 예측할 수있음 |
/D | 전처리기 정의 | 전처리기 정의 |
/errorReport:prompt | 내부 컴파일러 오류 보고 | Microsoft에 내부 컴파일러 오류를 즉시 보고 |
/WX- | 모든 컴파일러 경고를 오류로 처리하지 않음 | 경고를 오류로 처리 /W 와 같이 확인 필요 |
/Zc:forScope | for 루프 범위의 강제 규칙 | cl에서는 사용 안함 |
/Gd | __cdecl 호출 규칙 | __cdecl 호출 규칙 |
/Oy- | /Oy는 프레임 포인터 생략을 사용하도록 설정하고 /Oy-는 생략을 사용하지 않도록 설정 | 프레임 포인터를 생략 |
/Oi | 내장 함수 만들기 | 내장 함수를 사용 |
/MD | 플리케이션에서 런타임 라이브러리의 다중 스레드별 및 DLL별 버전을 사용 | MSVCRT.LIB에 링크 |
/FC | 진단에서 소스 코드 파일의 전체 경로 | 진단에 전체 경로 이름을 사용 |
/Fa | 컴파일의 각 소스 코드 파일에 대해 하나의 source.asm 파일 생성 | 어셈블리 목록 파일 이름을 지정 |
/EHsc | 표준 C++ 스택 해제를 사용하도록 설정 | C++ EH를 사용합니다(SEH 예외 제외) |
/nologo | 시작 배너 표시 안 함 | 저작권 메시지를 표시하지 않음 |
/Fo | 개체 파일 이름 | 컴파일러 명령에서 생성된 모든 개체 파일에 대한 출력 디렉터리를 설정 |
/Fp | .pch 파일 이름 | 기본 경로 이름을 사용 하는 대신 미리 컴파일된 헤더의 경로 이름을 제공 |
/diagnostics:column | 컴파일러 진단 옵션 | 문제가 발견된 열도 포함됩니다. 이렇게 하면 문제를 일으키는 특정 언어 구문 또는 문자를 식별하는 데 도움 |
그리고 다음 비주얼 스튜디오의 기본 링커 옵션이고 역시나 다 적용할 필요는 없으니 필요한 것만 추려서 사용하면 된다.
/OUT:"C:\Users\yang\Desktop\vs2019\VS2019\MSSQL\Release\hello.exe" /MANIFEST /LTCG:incremental /NXCOMPAT /PDB:"C:\Users\yang\Desktop\vs2019\VS2019\MSSQL\Release\hello.pdb" /DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG /MACHINE:X86 /OPT:REF /SAFESEH /INCREMENTAL:NO /PGD:"C:\Users\yang\Desktop\vs2019\VS2019\MSSQL\Release\hello.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Release\hello.exe.intermediate.manifest" /LTCGOUT:"Release\hello.iobj" /OPT:ICF /ERRORREPORT:PROMPT /ILK:"Release\hello.ilk" /NOLOGO /TLBID:1
- Link 기본 옵션
옵션 | 설명 | 추가 설명 |
/OUT | 결과 파일 명 | 출력 파일의 사용자 지정 이름 |
/MANIFEST | side-by-side 어셈블리 매니페스트 만들기 | |
/LTCG:incremental | 링크 타임 코드 생성 | 링커가 전체 프로젝트 대신 편집의 영향을 받는 파일에 전체 프로그램 최적화 |
/NXCOMPAT | 데이터 실행 방지 기능 | 기본 힙, 스택 및 메모리 풀과 같은 데이터 페이지에서 코드가 실행 되는 것을 방지 |
/PDB | 프로그램 데이터베이스(PDB) 사용 | 기본 이름을 대체 |
/DYNAMICBASE | 주소 공간 레이아웃을 임의로 지정 | 임의로 기준 주소를 지정할 수 있는 실행 가능 이미지를 생성할지 여부를 지정 |
/DEBUG | 디버깅 정보 생성 | 실행 파일에 대한 디버깅 정보를 생성 |
/MACHINE:X86 | 대상 플랫폼 지정 | {ARM|EBC|X64|X86} 선택하여 사용 |
/OPT:REF | 최적화 | 참조 되지 않는 함수 및 데이터를 제거 |
/SAFESEH | 이미지에 안전한 예외 처리기 포함 | 링커는 이미지의 안전한 예외 처리기 테이블을 생성할 수 있는 경우에만 이미지를 생성 |
/INCREMENTAL:NO | 증분 링크 무시 | 설정할 경우 링크 과정에서 실제 변경된 obj만 계산해서 빌드 속도를 개선시키고, 코드와 데이터에 패딩이 추가되어 바이너리 크기가 약간 커짐 |
/PGD | 프로필 기반 최적화를 위한 데이터베이스 지정 | 실행 중인 프로그램에 대한 정보를 보관하는 데 사용되는 .pgd 파일의 이름을 지정 |
/SUBSYSTEM:CONSOLE | 하위 시스템 지정 | 실행 파일의 환경을 지정 |
/MANIFESTUAC | 사용자 계정 컨트롤 정보를 program 매니페스트에 포함할지 여부를 지정 | uiAccess='true' 애플리케이션이 사용자 인터페이스 보호 수준을 무시하고 데스크톱에서 더 높은 권한 창으로 입력을 구동하도록 하려면 이고, 그렇지 않으면 uiAccess='false' |
/ManifestFile | 매니페스트 파일 이름 지정 | 매니페스트 파일의 기본 이름 변경. 매니페스트 파일의 기본 이름은 .manifest가 추가된 파일 이름 |
/LTCGOUT | 링크 타임 코드 생성 | 링커가 전체 프로젝트 대신 편집의 영향을 받는 파일에 전체 프로그램 최적화 |
/OPT:ICF | 최적화 | 동일한 COMDAT 정리를 수행 |
/ERRORREPORT: PROMPT |
내부 링커 오류 보고 | Windows 오류 보고 서비스 설정으로 재정의 |
/ILK | 링커 파일 생성 | 사용안함 |
/NOLOGO | 시작 배너 표시 안 함 | 저작권 메시지 및 버전 번호가 표시되지 않음 |
/TLBID:1 | TypeLib의 리소스 ID 지정 | 링커에서 만든 형식 라이브러리의 사용자 지정 값. 기본 리소스 ID 1을 재정의. |
CL 컴파일
이제 간단한 소스를 작성하여 cl 명령어를 사용해 봅니다. hello.c 파일로 저장합니다.
#include <stdio.h>
int main()
{
printf("hello");
}
작성 후 cl 명령어로 파일명을 파라미터로 실행해 봅니다. obj 파일과 exe 실행 파일이 생성 됩니다.
> cl hello.c
hello.exe 파일을 수행하며 hello 가 찍히면서 정상 동작 하는것을 확인할 수 있습니다.
CL 컴파일 옵션 적용
이제 위에서 확인한 비주얼 스튜디오 옵션을 적용해서 exe 파일을 작성해 봅니다.
파일경로 및 /OUT 옵션만 변경해서 실행 해 봅니다.
>cl /permissive- /OUT:"." /GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"vc142.pdb" /Zc:inline /fp:precise /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MD /FC /Fa"src.asm" /EHsc /nologo /Fo"src.fo" /Fp"hello.pch" /diagnostics:column hello.c
이제 vscode 나 다른 편집기 사용 후 옵션은 그대로 사용한다면 간단히 컴파일이 가능하니 편하게 사용하면 됩니다.
'개발툴 > VScode' 카테고리의 다른 글
[VScode] 단축키 (0) | 2021.12.23 |
---|---|
[VScode] Visual Studio Code 프로젝트 생성 (Spring boot) Web Server (0) | 2021.12.20 |
[VScode] Visual Studio Code 설치 (0) | 2021.12.17 |
댓글