[Modern c++ 1] Build basics

Sinaenjuni·2023년 7월 13일
0

Modern C++

목록 보기
1/1

Compiling step-by-step

Example code

#include <iostream>

int main(){
    std::cout << "Hello world";
    return 0;
}

1. Preprocess

이 단계의 파일 내용을 보면 header에 적은 표준 라이브러리와 같은 iostream에 관한 코드들 까지 포함하고 있는 것을 확인할 수 있다.

$ clang++ -E main.cpp > main.i
shinhyeonjun@sinhyeonjun-ui-MacBookPro slam % ls
main.cpp        main.i

2. Compilation

이 과정을 통해 어셈블리 코드를 얻을 수 있다.

clang++ -S main.i
shinhyeonjun@sinhyeonjun-ui-MacBookPro slam % ls
main.cpp        main.i          main.s

3. Assembly

실제 동작할 하드웨어의 정보를 가지고 어셈블리 파일(이진 파일)을 만든다.

clang++ -c main.s
shinhyeonjun@sinhyeonjun-ui-MacBookPro slam % ls
main.cpp        main.i          main.o          main.s

4. Linking

clang++ main.o -o main
shinhyeonjun@sinhyeonjun-ui-MacBookPro slam % ls
main            main.cpp        main.i          main.o          main.s
shinhyeonjun@sinhyeonjun-ui-MacBookPro slam % ./main
Hello world%                                       

[1,2,3,4]

clang++ main.cpp

Libraries

Multiple object files that are logically connected

  • Static: faster, take a lot of space, become part of the end binary, named: llb*.a
  • Dynamic: slower, can be copied, referenced by a program, named: lib*.so

Create a static library with

ar rcs libname.a module.o module.o ...

Static libraries are just archives just like

zip/tar/...

What is linking?

How to build libraries?

folder/
	--- tools.hpp
    --- tools.cpp
    --- main.cpp

tools.hpp file

#pragma once
void MakeItSunny();
void MakeItRain();

"#pragma once"는 C++ 프로그래밍 언어에서 사용되는 전처리기 지시문입니다. 이 지시문은 헤더 파일(.h)에서 중복된 포함을 방지하기 위해 사용됩니다.

tools.cpp file

#include "tools.hpp"
#include <iostream>
void MakeItRain(){
	std::cout << "Here! Now it rains! Happy?\n";
}
void MakeItSunny(){
	std::cerr << "Not available\n";
}

main.cpp file

#include "tools.hpp"
int main(){
	MakeItRain();
    MakeItSunny();
    return 0;
}

clang++ main.cpp를 하면 linker file을 찾을 수 없기 때문에 build가 중단된다.

$ c++ -std=c ++17 -c tools.cpp -o tools.o
$ ar rcs libtools.a tools.o  <other_modules>
$ c++ -std=c++17 main.cpp -L . -ltools -o main

$ ./main
Here! Now it rains! Happy?
Not available

nm -gC tools.o를 통해 내용 확인이 가능하다.

Build system

Automate the build process of projects. CMake is meta build system. CMake is not a build system. It;s a build system generator. we need to use an actual build system like Make or Ninja.

CMakeLists.txt file

cmake_minimum_required(VERSION 3.26)    # Mandatory
project(first_project)                  # Mandatory

set(CMAKE_CXX_STANDARD 17)              # Use c++17
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)   # 컴파일 과정에서 나오는 명령어 정보들을 json 파일로 만들어준다.

add_library(tools tools.cpp)
add_executable(main main.cpp)
target_link_libraries(main tools)
$ mkdir build && cd build
$ cmake ..
$ make
[
{
  "directory": "/Users/shinhyeonjun/code/slam/libraries_test/build",
  "command": "/Library/Developer/CommandLineTools/usr/bin/c++   -std=gnu++17 -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk -o CMakeFiles/tools.dir/tools.cpp.o -c /Users/shinhyeonjun/code/slam/libraries_test/tools.cpp",
  "file": "/Users/shinhyeonjun/code/slam/libraries_test/tools.cpp",
  "output": "CMakeFiles/tools.dir/tools.cpp.o"
},
{
  "directory": "/Users/shinhyeonjun/code/slam/libraries_test/build",
  "command": "/Library/Developer/CommandLineTools/usr/bin/c++   -std=gnu++17 -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk -o CMakeFiles/main.dir/main.cpp.o -c /Users/shinhyeonjun/code/slam/libraries_test/main.cpp",
  "file": "/Users/shinhyeonjun/code/slam/libraries_test/main.cpp",
  "output": "CMakeFiles/main.dir/main.cpp.o"
}
]

0개의 댓글