Back

Cmake的安装与CMakeLists.txt的编写

安装

cmake是自动化项目编译工具,可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake 支持 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake 也支持静态与动态程式库的建构。

下载地址👉Download | CMake, 建议二进制安装。

win:

https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1-windows-x86_64.zip

ubuntu:

sudo apt install cmake
wget https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1-linux-x86_64.tar.gz

centos:

sudo yum install cmake

arch:

sudo pacman -S cmake

编写CMakeLists.txt

单文件单目录CMakeLists.txt编写

# 指定cmake版本
cmake_minimum_required(VERSION 3.22)

# 工程名
project(demo1)

# 指定编译后文件名
set(OUTPUTNAME demo1)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -g -O2 -std=c++20") # 指定编译参数

# 指定源文件夹
aux_source_directory(. DIR_SRCS)

# 编译文件
add_executable(${OUTPUTNAME} ${DIR_SRCS})

此文件加编写完毕后,创建一个build文件夹,cd进去,执行cmake ..,会生成Makefile文件,再然后执行make编译,最终生成项目文件。

多文件单目录CMakeLists.txt编写

和demo1相同

# 指定cmake版本
cmake_minimum_required(VERSION 3.22)

# 工程名
project(demo2)

# 指定编译后文件名
set(OUTPUTNAME demo2)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -g -O2 -std=c++20") # 指定编译参数

# 指定源文件夹
aux_source_directory(. DIR_SRCS)

# 编译文件
add_executable(${OUTPUTNAME} ${DIR_SRCS})

多文件多文件夹CMakeLists.txt编写

每一个项目都要建一个CMakeLists.txt,并且每一个文件夹都要有一个CMakeLists.txt文件

项目根目录的CMakeLists.txt

# 指定cmake版本
cmake_minimum_required (VERSION 3.22)

# 项目信息
project (Demo3)

# 指定编译后文件名
set(OUTPUTNAME demo3)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -g -O2 -std=c++20") # 指定编译参数

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# 添加 math 子目录
add_subdirectory(math)

# 指定生成目标 
add_executable(${OUTPUTNAME} ${DIR_SRCS})

# 添加链接库
target_link_libraries(${OUTPUTNAME} MathFunctions)

项目其他目录的CMakeLists.txt

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)

# 生成链接库,动态库
# 静态库add_library (MathFunctions STATIC ${DIR_LIB_SRCS})
add_library (MathFunctions SHARED ${DIR_LIB_SRCS})

库文件CMakeLists.txt编写

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)

# 生成链接库,动态库
# 静态库add_library (MathFunctions STATIC ${DIR_LIB_SRCS})
add_library (MathFunctions SHARED ${DIR_LIB_SRCS})

库文件安装CMakeLists.txt编写

在指定的库源文件目录添加:

# 指定 MathFunctions 库的安装路径
install (TARGETS MathFunctions DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)

demo会被放到bin,*.h会被放到/usr/local/include

# 指定安装路径
install (TARGETS Demo DESTINATION bin)
install (FILES "${PROJECT_BINARY_DIR}/config.h"
         DESTINATION include)

库文件指定输出路径与编译后的工程目录

库文件输出目录设置

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)

# 把库文件的输出路径设置为lib
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

# 生成链接库,动态库
# 静态库add_library (MathFunctions STATIC ${DIR_LIB_SRCS})
add_library (MathFunctions SHARED ${DIR_LIB_SRCS})

项目工程目录设置

cmake_minimum_required(VERSION 3.22)

project(abstract_factory_pattern)

set(OUTPUTNAME test)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -g -O2 -std=c++20")

# 声明库文件目录
include_directories(${PROJECT_SOURCE_DIR}/mylib)

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) # 设置可执行文件输出目录为bin

aux_source_directory(. DIR_SRCS)

add_executable(${OUTPUTNAME} ${DIR_SRCS})

target_link_libraries(${OUTPUTNAME} Mylib) # 链接mylib目录下的Mylib库