构建系统

(3 mins to read)

build_system

gcc/clang

但是直接用编译指令一方面是很麻烦,指令会很长,另一方面是编译太慢,每次都需要重新编译。

Makefile

自动维护依赖,增量构建。

但是用户可能用不同的编译器,不同的平台,于是有了一个configure文件(autotool),可以通过./configure基于Makefile.in模板生成适合用户所在平台的Makefile。

CMake

CMake则是构建系统的构建系统,编写一份CMakeLists.txt就可以生成对应平台的相应构建系统(如Make、Ninja),然后再用该构建系统构建项目。CMake可以检测用户的平台和编译器。

对象库:CMake自创的概念,不是一个真正的库,不会像静态库或动态库那样生成.a.so文件,而是一个基于包含的源文件编译出的对象文件的临时集合,这只是一种组织代码的方式,可以管理公共的依赖项,并且保证了跨平台的统一性。

1
2
add_library(mylib OBJECT lib.cpp)
add_executable(myapp main.cpp $<TARGET_OBJECTS:mylib>)

$<...>是一个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

解决依赖冲突

解决循环依赖