Readme

Readme

CMake Tutorial #

由于不同平台的makefile写法不同,因此需要一个集大成者cmake来实现:“Write once, run everywhere”。cmake主要用于生成makefile,实际的编译组织工作还是由make来实现。

在看了一些C++工程的CMake文件后,结合官网给的文档,对于CMake的设计思想有了一些理解。

核心思想 #

CMake的核心思想是通过对构建对象的描述来组织编译。我们的代码核心的构建对象只有两类: 库(lib)可执行文件(exe)

因此我们需要了解CMake的两个核心函数:add_library, add_executable。分别对应了两类目标。一个常规的用法如下:


# for lib

set(SRC_FILES_LIB xxx.cpp xxx.cpp xxx.cpp ...)
addlibrary("xxx_lib" ${SRC_FILES_LIB})


# for exe

set(SRC_FILES_EXEC xxx.cpp xxx.cpp xxx.cpp ...)
add_executable("xxx_exec" ${SRC_FILES_EXEC})

以上的两个部分,仅仅是简单的描述了目标程序的来源构成

一个简单完整的CMake项目 #

# 设定cmake的最小版本
cmake_minimum_required(VERSION 3.21)

# 设定允许指定项目的版本
cmake_policy(SET CMP0048 NEW)

# 设定项目的<project_name, VERSION>
project(codeshark VERSION 1.0.0)

# 设定CXX编译标准
set(CMAKE_CXX_STANDARD 11)

# 设定CXX编译器的标志   
set(CMAKE_CXX_FLAGS_RELEASE "-g -O2 -DNDEBUG")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Werror -Wno-format")


# 收集需要开放的头文件
set(SOURCE_HEADS_LIB 
    include/union_find.hpp)


# 收集lib库的源代码
set(SOURCE_FILES_LIB
    src/union_find.cpp)

# 设定编译目标lib, 类型,源代码
add_Library(codeshark-mkdata STATIC ${SOURCE_FILES_LIB})

# 设定可执行文件的源代码
set(SOURCE_FILES_EXEC
    src/main.cpp)

# 设定第三方库
set(libxxx ${PROJECT_SOURCE_DIR}/deps/openssl/lib/libssl.a)

# 添加可执行文件目标
add_executable(main ${SOURCE_FILES_EXEC})

# 添加依赖的库,可以是上面指定的lib,或是安装的其他库
target_link_libraries(main codeshark-mkdata libxxx)

# 添加target的头文件检索目录
target_include_directories(main PUBLIC include/)


# 安装头文件与连接库(make install)
install(FILES ${SOURCE_HEADS_LIB} DESTINATION /usr/local/include/codeshark)
install(TARGETS codeshark-mkdata DESTINATION /usr/local/lib)

[参考文献] #

  1. https://zhuanlan.zhihu.com/p/338657327