#include <iostream>
int main(){
std::cout << "Hello world";
return 0;
}
이 단계의 파일 내용을 보면 header에 적은 표준 라이브러리와 같은 iostream에 관한 코드들 까지 포함하고 있는 것을 확인할 수 있다.
$ clang++ -E main.cpp > main.i
shinhyeonjun@sinhyeonjun-ui-MacBookPro slam % ls
main.cpp main.i
이 과정을 통해 어셈블리 코드를 얻을 수 있다.
clang++ -S main.i
shinhyeonjun@sinhyeonjun-ui-MacBookPro slam % ls
main.cpp main.i main.s
실제 동작할 하드웨어의 정보를 가지고 어셈블리 파일(이진 파일)을 만든다.
clang++ -c main.s
shinhyeonjun@sinhyeonjun-ui-MacBookPro slam % ls
main.cpp main.i main.o main.s
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%
clang++ main.cpp
Multiple object files that are logically connected
ar rcs libname.a module.o module.o ...
zip/tar/...
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
를 통해 내용 확인이 가능하다.
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"
}
]