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)