# C++ with Clang & Make — Cheat Sheet ## Writing C++ A basic C++ file (`hello.cpp`): ```cpp #include int main() { std::cout << "Hello, world!" << std::endl; return 0; } ``` ## Compiling with Clang | Command | What it does | Example | |---------|-------------|---------| | `clang++ ` | Compile to an executable named `a.out` | `clang++ hello.cpp` | | `clang++ -o ` | Compile and name the output | `clang++ hello.cpp -o hello` | | `clang++ -Wall ` | Enable **all** warnings (always use this!) | `clang++ -Wall hello.cpp -o hello` | | `clang++ -std=c++17 ` | Use a specific C++ version | `clang++ -std=c++20 -Wall prog.cpp -o prog` | | `clang++ -g ` | Include debug info (for use with a debugger) | `clang++ -g -Wall hello.cpp -o hello` | **Common flags explained:** | Flag | Meaning | |------|---------| | `-o ` | Output filename (instead of `a.out`) | | `-Wall` | Enable most compiler warnings | | `-Wextra` | Enable even more warnings | | `-std=c++17` | Use C++17 standard (also `c++11`, `c++14`, `c++20`) | | `-g` | Include debug symbols (for `gdb` or `lldb`) | | `-O2` | Optimize for speed | ### Full compile example ```bash clang++ -Wall -Wextra -std=c++20 my_program.cpp -o my_program ./my_program ``` ## Running Your Program ```bash ./my_program # Run it ./my_program arg1 # Pass a command-line argument ``` ## Make & Makefiles `make` automates your build so you don't have to type long `clang++` commands. ### Example project structure ``` project/ ├── Makefile ├── main.cpp ├── helpers.cpp └── helpers.hpp ``` ### Minimal Makefile ```make hello: hello.cpp clang++ -Wall -std=c++17 hello.cpp -o hello ``` **⚠️ The indented line must use a Tab, not spaces.** ### Building with make ```bash make # Build the first target make hello # Build the target named 'hello' ``` ### Better Makefile with variables ```make CXX = clang++ CXXFLAGS = -Wall -Wextra -std=c++20 TARGET = my_program $(TARGET): main.cpp helpers.cpp helpers.hpp $(CXX) $(CXXFLAGS) main.cpp helpers.cpp -o $(TARGET) clean: rm -f $(TARGET) .PHONY: clean ``` | Command | What it does | |---------|-------------| | `make` | Build the program | | `make clean` | Delete the compiled program | | `make -j4` | Build using 4 CPU cores (faster) | ### Typical Makefile with separate compilation ```make CXX = clang++ CXXFLAGS = -Wall -Wextra -std=c++20 TARGET = my_program OBJECTS = main.o helpers.o $(TARGET): $(OBJECTS) $(CXX) $(OBJECTS) -o $(TARGET) main.o: main.cpp helpers.hpp $(CXX) $(CXXFLAGS) -c main.cpp -o main.o helpers.o: helpers.cpp helpers.hpp $(CXX) $(CXXFLAGS) -c helpers.cpp -o helpers.o clean: rm -f $(TARGET) $(OBJECTS) .PHONY: clean ``` ## Quick Reference — Common Workflow ```bash # 1. Write your code nano hello.cpp # 2. Compile clang++ -Wall -std=c++20 hello.cpp -o hello # 3. Run ./hello # Or use a Makefile make ./hello ``` ## Tips - Always compile with `-Wall` — warnings catch bugs! - Use `-std=c++20` to get modern C++ features (`auto`, `ranges`, `std::span`, etc.) - If `clang++` isn't installed: `sudo apt install clang` - If `make` isn't installed: `sudo apt install make` - When editing Makefiles: **rules must be indented with a Tab character**