¶gcc/clang
但是直接用编译指令一方面是很麻烦,指令会很长,另一方面是编译太慢,每次都需要重新编译。
¶Makefile
自动维护依赖,增量构建。
但是用户可能用不同的编译器,不同的平台,于是有了一个configure文件(autotool),可以通过./configure
基于Makefile.in
模板生成适合用户所在平台的Makefile。
¶CMake
CMake则是构建系统的构建系统,编写一份CMakeLists.txt
就可以生成对应平台的相应构建系统(如Make、Ninja),然后再用该构建系统构建项目。CMake可以检测用户的平台和编译器。
对象库:CMake自创的概念,不是一个真正的库,不会像静态库或动态库那样生成.a
或.so
文件,而是一个基于包含的源文件编译出的对象文件的临时集合,这只是一种组织代码的方式,可以管理公共的依赖项,并且保证了跨平台的统一性。
1 | add_library(mylib OBJECT lib.cpp) |
$<...>
是一个generator-expression,是在构建过程中执行的表达式。
target的传播:
- interface: only cares about others and allows inheritance
- private: only cares about himself and does no allow inheritance
- public: interface + private, it cares about every one and allows inheritance
¶Safety CMake
tipi-build: https://www.youtube.com/watch?v=Sh3uayB9kHs
1 | set(CMAKE_CXX_CLANG_TIDY clang-tidy -checks=-*,cppcoreguidelines-*) |
sanitizers cmake
1 | add_sanitizers(exe) |
注意这些消毒剂互相之间并不兼容:
- AddressSanitizer
- UndefinedBehaviorSanitizer
- ThreadSanitizer
- LeakSanitizer
- MemorySanitizer