[C++] 빌드/컴파일

haeryong·2023년 1월 27일
0

Build Process

C++은 header 파일과 cpp 파일로 나뉜다.
라이브러리의 경우 static / dynamic / header only 라이브러리가 존재함.

  1. pre processor
  • #include , #define 등을 찾아 치환.
  • translation unit을 생성.
  1. compile
  • 머신 코드, 데이터로 이루어진 object file 생성.
  1. Linker
  • object file을 모아 실행가능한 executable file 생성.
  • 코드 + data + 추가정보로 이루어짐.

compiler

  • build process를 진행해주는 프로그램.
  • clang, gcc, Visual C++ 등등..
# -o 를 이용해 실행파일 이름 지정
g++ main.cpp -o greeting 

# -Wall : warning
g++ main.cpp -o greeting -Wall

# -Werror : warning을 에러로 취급 -> 컴파일 안됨.
g++ main.cpp -o greeting -Wall -Werror

# c++17으로 컴파일
g++ main.cpp -o greeting -Wall -Werror -std=c++17

# -v : 여러 정보들 출력. 컴파일러 종류, 경로 등등..
g++ main.cpp -o greeting -Wall -Werror -std=c++17 -v

Pre processor

1. conditionally

#ifdef A
	~
#else
	~
#endif

#ifndef A
	~
#elif A == 0
	~
#else
	~
#endif
  • constexpr if 사용 권장.
constexpr int ABCD = 2;
if constexpr (ABCD)
{
    std::cout << "1: yes\n";
}
else
{
    std::cout << "1: no\n";
}

2. replace

#define MAX_UINT16 65535
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
  • constexpr 변수 사용 권장.
  • algorithm, limits 라이브러리 사용 권장.

3. include

  • standard library의 경우 #include <iostream>
  • user specific header의 경우 #include "foo.h"

header guard

#ifndef CAT_H
#define CAT_H
class Cat
{
~
}

#endif

Extern : 바깥쪽에서 링크를 찾음.
Static : 안쪽에서만 링크.(internal)

variable


extern int a; // 외부 파일에서 a의 정의를 찾음.

static int a = 100; // 이 파일(object file) 안에서만 접근 가능.

function

extern void foo(); // 외부 파일에 foo 함수가 정의되어 있음을 알림.

static void foo(); // 이 파일(object file) 안에서만 접근 가능.

extern "C"

  • name mangling 제거.

Debug

unit test, integration test, code review 이후 버그 발생 시 debug 모드로 코드 컴파일.

# 디버그모드로 컴파일
g++ main.cpp -g 

GDB, VS code 이용해 디버깅.

static library

code, binary를 가져와서 사용 가능.

  1. Header only
  • header를 include해 사용.
  1. static library
  • 윈도우에서 .lib, 리눅스에서 .a 확장자. 링크를 통해 사용.
  1. dynamic library
  • loadtime(실행 시)에 바인딩
  • runtime(프로세스 실행 중)에 바인딩.
  • 윈도우에서 .dll, 리눅스에서 .so 확장자.
# object file 생성
g++ cat.cpp -c -O2 -Wall -Werror

# .a 파일(archive file) 생성
ar -rs libcat.a cat.o

# 현재 디렉터리에서 cat이라는 라이브러리를 추가해 빌드.
g++ main.cpp -L . -lcat 

dynamic, shared library

process load time 또는 runtime에 바인딩됨.

loadtime

runtime

constexpr

compile time에 계산 가능한 값들.

0개의 댓글