【CMake】知识总结

文章目录

  • 1. 总体认识
  • 2. CMake的使用
    • 2.1. 终端命令
    • 2.2. 创建最基本的CMake项目
    • 2.3. 添加库
    • 2.4. 添加库的使用要求
    • 2.5. 添加生成器表达式
    • 2.6. 安装和测试

1. 总体认识

  • CMake是一个管理源代码构建的工具。最初,CMake是作为Makefile的生成器设计的,现在CMake可以用于生成现代构建系统(如Ninja)以及IDE(如Visual Studio和Xcode)的项目文件。
  • CMake广泛用于C和C++语言,但也可以用于构建其他语言的源代码。
  • CMake的安装:去CMake官网下载安装程序安装即可。

2. CMake的使用

2.1. 终端命令

mkdir build
cd build
cmake ..		# 创建项目
cmake --build .	# 构建目标
cd Debug

2.2. 创建最基本的CMake项目

  • 文件结构
- CMakeLists.txt
- tutorial.cxx:源文件
- TutorialConfig.h.in:配置文件
  • CMakeLists.txt
# 设置支持的最低cmake版本
cmake_minimum_required(VERSION 3.10)

# 创建一个名为Tutorial的项目,版本号为1.0
project(Tutorial VERSION 1.0)

# 设置C++标准并要求编译器使用该标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 将TutorialConfig.h.in中的配置内容转换到TutorialConfig.h
configure_file(TutorialConfig.h.in TutorialConfig.h)

# 添加可执行文件Tutorial以及源文件tutorial.cxx
add_executable(Tutorial tutorial.cxx)

# 指定头文件目录为当前项目的二进制目录即build
target_include_directories(Tutorial PUBLIC ${PROJECT_BINARY_DIR})
  • TutorialConfig.h.in
// Tutorial的配置选项
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

2.3. 添加库

  • 文件结构
- MathFunctions:库目录
	-- CMakeLists.txt
	-- MathFunctions.cxx:主源文件(通过条件编译选项USE_MYMATH选择哪种实现)
	-- MathFunctions.h:主头文件
	-- mysqrt.cxx:自定义sqrt实现源文件
	-- mysqrt.h:自定义sqrt实现头文件
- CMakeLists.txt
- tutorial.cxx:源文件
- TutorialConfig.h.in:配置文件
  • 终端命令
mkdir build
cd build
cmake .. [-DUSE_MYMATH=ON/OFF]	# 条件编译选项,默认为ON
cmake --build .
cd Debug
  • CMakeLists.txt(主程序目录)
cmake_minimum_required(VERSION 3.10)

project(Tutorial VERSION 1.0)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

configure_file(TutorialConfig.h.in TutorialConfig.h)

# 添加子目录MathFunctions
add_subdirectory(MathFunctions)

add_executable(Tutorial tutorial.cxx)

# 将MathFunctions库链接到Tutorial
target_link_libraries(Tutorial PUBLIC MathFunctions)

# 将MathFunctions库的头文件目录添加到Tutorial的包含目录
target_include_directories(Tutorial PUBLIC
                           "${PROJECT_BINARY_DIR}"
                           "${PROJECT_SOURCE_DIR}/MathFunctions"
                           )
  • CMakeLists.txt(库目录)
# 添加名为MathFunctions的库和生成库的源文件
add_library(MathFunctions MathFunctions.cxx)

# 添加条件编译选项USE_MYMATH并默认设置为ON
option(USE_MYMATH "Use tutorial provided math implementation" ON)

if (USE_MYMATH) # 如果USE_MYMATH为ON,
    # 将USE_MYMATH作为预编译定义传递到库中
    target_compile_definitions(MathFunctions PRIVATE "USE_MYMATH")

    # 添加名为SqrtLibrary的静态库和生成库的源文件
    add_library(SqrtLibrary STATIC
              mysqrt.cxx
              )
    # 链接库SqrtLibrary到MathFunctions库中
    target_link_libraries(MathFunctions PRIVATE SqrtLibrary)
endif()

2.4. 添加库的使用要求

  • 文件结构
- MathFunctions:库目录
	-- CMakeLists.txt
	-- MathFunctions.cxx:主源文件(通过条件编译选项USE_MYMATH选择哪种实现)
	-- MathFunctions.h:主头文件
	-- mysqrt.cxx:自定义sqrt实现源文件
	-- mysqrt.h:自定义sqrt实现头文件
- CMakeLists.txt
- tutorial.cxx:源文件
- TutorialConfig.h.in:配置文件
  • CMakeLists.txt(主程序目录)
cmake_minimum_required(VERSION 3.10)

project(Tutorial VERSION 1.0)

# 创建名为tutorial_compiler_flags的接口库,并添加使用C++11标准的编译器选项
add_library(tutorial_compiler_flags INTERFACE)
target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

configure_file(TutorialConfig.h.in TutorialConfig.h)

add_subdirectory(MathFunctions)

add_executable(Tutorial tutorial.cxx)

# 将库MathFunctions和编译器选项信息链接到Tutorial
target_link_libraries(Tutorial PUBLIC MathFunctions tutorial_compiler_flags)

target_include_directories(Tutorial PUBLIC
                           "${PROJECT_BINARY_DIR}"
                           )
  • CMakeLists.txt(库目录)
add_library(MathFunctions MathFunctions.cxx)

# 声明任何使用MathFunctions的库都需要包含当前源目录,除了MathFunctions本身
target_include_directories(MathFunctions
                           INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
                           )

option(USE_MYMATH "Use tutorial provided math implementation" ON)
if (USE_MYMATH)
  target_compile_definitions(MathFunctions PRIVATE "USE_MYMATH")

  add_library(SqrtLibrary STATIC
              mysqrt.cxx
              )

  # 将编译器选项信息链接到库MathFunctions
  target_link_libraries(MathFunctions PUBLIC tutorial_compiler_flags)

  target_link_libraries(MathFunctions PRIVATE SqrtLibrary)
endif()

# 将编译器选项信息链接到库SqrtLibrary
target_link_libraries(SqrtLibrary PUBLIC tutorial_compiler_flags)

2.5. 添加生成器表达式

  • 文件结构
- MathFunctions:库目录
	-- CMakeLists.txt
	-- MathFunctions.cxx:主源文件(通过条件编译选项USE_MYMATH选择哪种实现)
	-- MathFunctions.h:主头文件
	-- mysqrt.cxx:自定义sqrt实现源文件
	-- mysqrt.h:自定义sqrt实现头文件
- CMakeLists.txt
- tutorial.cxx:源文件
- TutorialConfig.h.in:配置文件
  • CMakeLists.txt(主程序目录)
# 要求cmake最低版本为3.15
cmake_minimum_required(VERSION 3.15)

project(Tutorial VERSION 1.0)

add_library(tutorial_compiler_flags INTERFACE)
target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11)

# 如果使用CXX并且编译器为ARMClang, AppleClang, Clang, GNU, LCC,
# 则创建值为true的变量gcc_like_cxx
# 如果使用CXX并且编译器为MSVC,
# 则创建值为true的变量msvc_cxx
set(gcc_like_cxx "$")
set(msvc_cxx "$")

# 添加警告编译选项到接口库
# 通过使用嵌套生成器表达式,只将标志用于构建树(build-tree)
target_compile_options(tutorial_compiler_flags INTERFACE
  "$<${gcc_like_cxx}:$>"
  "$<${msvc_cxx}:$>"
)

configure_file(TutorialConfig.h.in TutorialConfig.h)

add_subdirectory(MathFunctions)

add_executable(Tutorial tutorial.cxx)

target_link_libraries(Tutorial PUBLIC MathFunctions tutorial_compiler_flags)

target_include_directories(Tutorial PUBLIC
                           "${PROJECT_BINARY_DIR}"
                           )
  • CMakeLists.txt(库目录)
add_library(MathFunctions MathFunctions.cxx)

target_include_directories(MathFunctions
                           INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
                           )

option(USE_MYMATH "Use tutorial provided math implementation" ON)
if (USE_MYMATH)
  target_compile_definitions(MathFunctions PRIVATE "USE_MYMATH")

  add_library(SqrtLibrary STATIC
              mysqrt.cxx
              )

  target_link_libraries(SqrtLibrary PUBLIC tutorial_compiler_flags)

  target_link_libraries(MathFunctions PRIVATE SqrtLibrary)
endif()

target_link_libraries(MathFunctions PUBLIC tutorial_compiler_flags)

2.6. 安装和测试

你可能感兴趣的:(Linux,cmake)