본문 바로가기
개발툴/VScode

[Visual Studio] CL 사용하여 빌드하기

by HmHjj 2022. 2. 7.
728x90
반응형

비주얼 스튜디오 툴에서 컴파일하여 사용하기 불편하여 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 나 다른 편집기 사용 후 옵션은 그대로 사용한다면 간단히 컴파일이 가능하니 편하게 사용하면 됩니다. 

728x90
반응형

댓글