Ch 10. 범위, 공간 - 01. 빌드

2025. 4. 18. 10:15Programming Language/C++

반응형

기존엔 ctrl + f5와 같은 단축키로 빌드했었는데 이런 빌드 과정을 수동으로 한번 진행해보고 그 내부의 과정을 파악해보도록 하자.

 

확인하기 이전에 추가로 메인 함수의 파라미터에 대해서 아래 작성해놓았으니 확인해보도록 하고 내용을 보자 

더보기

메인함수의 파라미터

C++의 main함수는 특별한 파라미터 두개를 받을 수 있다.

int main(int argc, char* argv[])

 

여기서 각각의 파라미터는 

- int argc : argument count의 약자로, 전달 받은 아규먼트의 갯수를 담는다

- char* argv[] : argument vector의 약자로, 전달 받은 아규먼트 값들을 배열로 담아온다.

 

그래서 우리가 사실은 ctrl + f5로 실행한 프로그램은 debug냐 release냐에 따라서 각각 exe파일로 저장되는데 

나는 디버그로 ctrl + f5로 빌드 했기에 Debug라는 디렉터리에 Hello.exe라는 파일이 생성된 것을 볼 수 있다.

이 경로에서 CMD창을 열어주고

 이렇게 명령어를 입력해주면

이렇게 공백문자를 구분으로 해서 문자열들이 argv에 저장되게 된다.

여기서 argv[0]는 우리가 실행시키는 프로그램 명이고 그 이후부터는 사용자가 전달한 전달인자를 받아온다고 생각하면 된다. 

 

이제 코드를 하나 입력해보자.

코드는 사실 중요한게 아니지만 우리가 하려는 코드는 cmd창에서 파라미터를 받아서 해당 파라미터를 메인 함수 내부에서 숫자타입으로 바꿔주고 이를 합해주는 함수를 호출하는 과정을 만들 것이다.

 

가장 먼저 메인 함수에 전달인자를 받을 매개변수를 선언해주자.

그리고 이제 받아온 값을 다 더해줄 total 변수를 생성해주고

그리고 이제 argv를 꺼내서 숫자로 만들어주기 위해서 for문을 사용해서 

argv의 0번째인자를 실행 프로그램명이됨

요소 하나하나를 String 타입으로 변경해주고 

이 String 타입을 stoi를 사용해서 숫자 타입으로 변경해 total 변수에 합쳐주자

여기서 함수를 하나 추가해주는데 이 함수는 외부 파일을 하나 추가해주고 

순서대로 파일을 하나 생성해주자.

그리고 의미는 없긴 하다만 받아온 값을 그냥 반환해주는 함수 하나를 만들어 저장해주자.

그리고 이 함수를 메인 함수가 있는 파일에서 프로토타입으로 선언해주고 

메인 함수에서 호출해주자.

 

이제 이렇게 만든 파일을 모두 저장해주고 윈도우의 검색 창에 Developer라고 검색하면

Developer Command Prompt for VS 2022라는 프로그램을 눌러서 열어주면

이렇게 창이 열린다.

 

우리는 여기서 cl이라는 것을 사용할 것인데 cl은 

이렇게 컴파일러를 실행시키는 명령어임을 확인할 수 있다.

일단 이렇게 띄워두고 visual studio로 다시 돌아가서 메인함수가 있는 cpp파일을 선택해준다음에 

보기 > 속성

을 누르면 우측에 속성 창이 나온다(f4로도 실행 가능)

그러면 여기서 전체 경로부분을 복사해서 

아까 열어뒀던 prompt를 열어서 cd 명령어를 이용해서 프로그램의 경로로 이동해주고 dir명령어를 입력하면

이렇게 해당 디렉터리 내부에 우리가 만들었던 두개의 파일이 존재하는 것을 확인할 수 있다.

이제 이걸 사용해서 우리가 직접 컴파일해보도록 하자

 

CLI로 컴파일하기

먼저 CLI로 컴파일을 할때에는 cl이라는 명령어를 사용한다

기본적인 컴파일 방법은 

cl 컴파일하려는 파일명1, 컴파일하려는 파일명2 ...

와 같이 컴파일을 할 수 있고 위에 우리의 경우엔

cl ptrTest.cpp func.cpp

로 두개의 파일을 컴파일할 수 있다.

그러면 이렇게 컴파일을 해주고 dir로 파일을 확인해보면

이렇게 세개의 파일이 생성된것을 볼 수 있다.

 

이제 ptrTest.exe를 실행해서 파라미터를 같이 넘겨줘 보면

이렇게 합을 주는 것을 볼 수 있다.

 

옵션: /c

cl에 마지막 부분에 /c 옵션을 넣으면 컴파일만을 진행한다.

기존에 우리가 진행한것도 컴파일인데 왜 컴파일만을 진행하기 위해서 /c 옵션을 또 넣어줄까?

 

무슨 내용인지 확인하기 위해서 우선 컴파일의 결과로 생성된 .obj파일과 .exe파일을 삭제해주자.

cli로 삭제할때 사용하는 명령어는 del명령어로 

del 삭제할파일명1, 삭제할 파일명2, ...

으로 삭제가 가능하다 

이렇게 삭제되면

이제 /c 옵션을 추가해서 컴파일을 진행해보자.

 

컴파일이 모두 진행되면 dir명령어로 파일이 생성된 것을 확인해보자.

보면 exe파일은 생성이 안된것을 볼 수 있는데 이는 컴파일은 .obj파일을 만드는 과정이고 이렇게 만든 obj파일을 엮어서 실행파일, 우리는 exe파일을 생성해주게 된다.

그렇기에 /c 옵션은 정확하게는 링크 과정 없이 컴파일만 하겠다는 의미이고 이 옵션이 없이 그냥 cl 명령어로 파일만 지정하면 해당 파일을 컴파일 한 후에 링킹 하겠다는 의미가 되는 것이다.

그래서 지금 두 파일은 서로 연관성이 있기 때문에 각각 파일만 따로 컴파일 + 링킹 과정을 수행하는데는 문제가 있을 것이다.

ptrTest.cpp파일만을 컴파일 하려고 하면

이렇게 외부(func.cpp)에서 가져온 speaker함수가 있기에 링킹이 불가능한 상태라서 

이렇게 컴파일은 됐으나 링크가 불가능하다고 알리는 것이고 func.cpp파일만 cl명령어로 컴파일 + 링크 하려고 하면

이렇게 진입점이 정의 되어야 한다고 하면서 메인함수가 없어서 링크가 불가능함을 알 수 있다.

이 또한 물론 컴파일은 되어진 상태로 링크만 불가능하다고 알리는 상태이다.

 

이제 컴파일만 진행하는것을 봤다면 이렇게 컴파일 되어 생성된 obj파일을 링크만 따로 해주는 방법이 있는데 이 방법은 

link obj파일명1 obj파일명2...

으로 링킹이 가능하다.

이렇게 명령어를 입력하면

이렇게 링킹된 exe파일이 생성되는 것을 알 수 있다.

 

이 프로그램을 또 실행해보면

이전처럼 잘 정상적으로 실행되는 것을 볼 수 있다.

 

옵션: -P

cl에 마지막 부분에 /P 옵션을 넣으면 컴파일 이전에 전처리 과정을 수행한다.

 

전처리 과정엔 우리가 코드로 작성한 전처리 지시자들을 수행한 후의 코드의 결과가 떨어지는 것으로 직접 눈으로 보자면

이렇게 수행이 종료되면 dir로 파일을 확인해보면

.i로 되어 있는 파일이 생성된것을 볼 수 있는데 이걸 한번 열어보면

파일의 가장 아래 쪽에 이렇게 우리가 작성한 코드가 있는 것을 볼 수 있는데 이 위에 작성되어 있는 내용은 사실 #include, 전처리지시자의 수행 결과로 이전에 말했듯이 #include는 그냥 단순하게 코드 자체를 가져와 넣어주는 역할을 한다 했다 싶이 위에 include한 모듈들의 내용을 모두 가져온 것이다.

보면

이 부분은 #include <string>의 결과로 가져온 string의 코드임을 알 수 있다.

 

추가로 우리가 메크로를 써서 

이렇게 만들어서 추가한 후에 /P옵션을 해서 전처리 과정을 거친 파일을 만들고 

이를 열어보면

이렇게 메크로를 define한 부분은 없어지고 실행한 부분이 아예 숫자의 형태로 교체됨을 확인할 수 있다.

 

이렇게 전처리 결과도 확인이 가능하다

 

그래서 결과적으로 빌드는 세부적으로 소스코드를 전처리 하고(cl 대상파일 /P) => 전처리된 파일(.i 파일)을 컴파일 하고(cl 대상파일 /c) => 컴파일된 파일(.obj 파일)을 링크해서 실행파일(.exe파일)을 생성하는 과정이라고 볼 수 있다.

 

반응형