CMake基础教程


用法
cmake -B build  // 配置,在源码目录用 -B 直接创建 build 目录并生成 build/Makefile
cmake --build build -j4  // 构建,Linux会调用make,Windows会调用devenv.exe
cmake --version 

定义
-DCMAKE_INSTALL_PREFIX=/opt/openvdb-8.0  //设置安装路径
-DCMAKE_BUILD_TYPE=Release  // 设置发布模式
-DBUILD_SHARED_LIBS:BOOL=ON

变量
PROJECT_SOURCE_DIR:当前项目源码路径(存放main.cpp的地方)
PROJECT_BINARY_DIR:当前项目输出路径(存放main.exe的地方)
CMAKE_SOURCE_DIR:根项目源码路径(存放main.cpp的地方)
CMAKE_BINARY_DIR:根项目输出路径(存放main.exe的地方)
PROJECT_IS_TOP_LEVEL:BOOL类型,表示当前项目是否是(最顶层的)根项目
PROJECT_NAME:当前项目名
CMAKE_PROJECT_NAME:根项目的项目名
PROJECT_VERSION_MAJOR     // x
PROJECT_VERSION_MINOR     // y
PROJECT_VERSION_PATCH     // z
${${PROJECT_NAME}_VERSION} 
BUILD_SHARED_LIBS
WIN32, APPLE, Linux, UNIX, ANDROID, IOS     // 简写变量,NOT非
CMAKE_CXX_COMPILER_ID
CMAKE_GENERATOR        // Ninja
CMAKE_CXX_COMPILER
CMAKE_C_COMPILER
$ENV{PATH}        //环境变量

脚本用法
project(项目名 LANGUAGES 使用的语言列表(C/C++ CUDA ASM) VERSION x.y.z)  
project(项目名 VERSION x.y.z)
cmake_minimum_required(VERSION 3.15)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)        // 允许动态库链接
set_property(TARGET otherlib CMAKE_POSITION_INDEPENDENT_CODE ON)  // 允许指定动态库链接
set_property(TARGET main PROPERTY WIN32_EXECUTABLE ON)        // win32不启用控制台窗口
set_property(TARGET main PROPERTY LIBRARY_OUT_DIRECTORY ./)        // 动态链接库输出路径
set_property(TARGET main PROPERTY ARCHIVE_OUT_DIRECTORY ./)        // 静态链接库输出路径
set_property(TARGET main PROPERTY RUNTIME_OUT_DIRECTORY ./)        // 可执行文件输出路径
set_properties(main PROPERTYS
    CXX_STANDARD 17
    LINK_WHAT_YOU_USE ON
    )
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} C:/cmake)
target_compile_definitions(main PUBLIC MY_MACRO=233 $<$<PLATFORM_ID:Windows,Linux>:MY_NAME=”Bill Gates”>)  // $<$<类型:值>:为真时的表达式>
if(MYVAR MATCHER "HELLO")   else()  endif()   //if 的特点:不需要加 ${},会自动尝试作为变量名求值
set(MYVAR ON PARENT_SCOPE)        // 子模块变量传递到父模块
if(DEFINED ENV{xx})    // 判断环境变量是否存在
set(ENV{x} ...)        // 设置环境变量

自定义FindXXX.cmake
set_target_properties(TBB::tbb PROPERTIES
    INTERFACE_COMPILE_DEFINITIONS ""
    INTERFACE_INCLUDE_DIRECTORIES "/include"
)
    

案例exe
cmake_minimum_required(VERSION 3.15)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS ON)
set(CMAKE_BUILD_TYPE Release)


project(zeno LANGUAGES C CXX VERSION 0.2.3)

if (PROJECT_BINARY_DIR STREQUAL PROJECT_SOURCE_DIR)
    message(WARNING "The binary directory of CMake cannot be the same as source directory!")
endif()

if (NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

if (WIN32)
    add_definitions(-DNOMINMAX -D_USE_MATH_DEFINES)
endif()

if (NOT MSVC)
    find_program(CCACHE_PROGRAM ccache)
    if (CCACHE_PROGRAM)
        message(STATUS "Found CCache: ${CCACHE_PROGRAM}")
        set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PROGRAM})
        set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE_PROGRAM})
    endif()
endif()

message("PROJECT_NAME: ${PROJECT_NAME}")
message("PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
message("PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}")
message("CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
message("CMAKE_CURRENT_BINARY_DIR: ${CMAKE_CURRENT_BINARY_DIR}")
add_subdirectory(mylib)

find_package(TBB)
if (TBB_FOUND)
    message(STATUS "TBB found at: ${TBB_DIR}")
    target_link_libraries(main PUBLIC TBB::tbb)
    target_compile_definitions(main PUBLIC WITH_TBB)
else()
    message(WARNING "TBB not found! using serial for")
endif()

add_executable(main)
file(GLOB sources CONFIGURE_DEPENDS *.cpp *.h)
aux_source_directory(. sources)
aux_source_directory(mylib sources)
target_sources(main PUBLIC ${sources})
target_link_libraries(main PUBLIC mylib)
target_compile_definitions(main PUBLIC MY_MACRO=233)
target_compile_definitions(main PUBLIC
    $<$<PLATFORM_ID:Windows>:MY_NAME="Bill Gates">
    $<$<PLATFORM_ID:Linux>:MY_NAME="Linus Torvalds">
    $<$<PLATFORM_ID:Darwin>:MY_NAME="Steve Jobs">
    )
target_compile_definitions(main PUBLIC
$<$<CXX_COMPILER_ID:GNU,Clang>:MY_NAME="Open-source">
$<$<CXX_COMPILER_ID:MSVC,NVIDIA>:MY_NAME="Commercial">
    )
target_compile_definitions(main PUBLIC
    $<$<AND:$<CXX_COMPILER_ID:GNU,Clang>,$<PLATFORM_ID:Linux,FreeBSD>>:MY_NAME="Open-source">
    )
    
案例lib
project(mylib)
if (NOT DEFINED BUILD_SHARED_LIBS)
    set(BUILD_SHARED_LIBS ON)
endif()
add_library(mylib STATIC mylib.cpp)
set_property(TARGET otherlib PROPERTY POSITION_INDEPENDENT_CODE ON)
message("mylib got PROJECT_NAME: ${PROJECT_NAME}")
message("mylib got CMAKE_SOURCE_DIR: ${CMAKE_SOURCE_DIR}")
message("mylib got CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}")
message("mylib got PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
message("mylib got PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}")
message("mylib got CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
message("mylib got CMAKE_CURRENT_BINARY_DIR: ${CMAKE_CURRENT_BINARY_DIR}")

引用

project — CMake 3.30.0-rc3 Documentation

CMake常见变量——Project和CMake相关信息_cmake 变量后缀-CSDN博客

cmake-generator-expressions(7) — CMake 3.30.0-rc3 Documentation

CMake: use of true/false or on/off or yes/no in generator expressions - Stack Overflow

if — CMake 3.7.2 Documentation

set — CMake 3.16.9 Documentation

Cmake入门之——Set方法(六)_cmake set-CSDN博客

Ccache — Compiler cache


创作不易,小小的支持一下吧!

2d50062d779a47afb478b75948ec28e5.pngd4a3f7989b534e9b8b67a6fa085b1129.jpeg

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: CMake是一个跨平台的工具,用于自动生成编译配置文件。CMake教程PDF提供全面的介绍和指导,以帮助您学习如何使用CMake构建跨平台的C++项目。该教程涵盖了CMake的大部分关键方面,包括语法,变量,函数和指令。 CMake教程PDF是一个很好的起点,因为它提供了一个完整的指南,以帮助您了解如何为您的C++项目使用CMake。该教程还涵盖了不同操作系统的支持以及如何使用CMake构建库和安装目标。 此外,该教程还提供了许多示例和练习来帮助您进一步了解CMake的各个方面。这些示例和练习包括从最简单的项目开始,逐步发展到复杂的实际例子,以帮助您学习如何使用CMake。 总而言之,CMake教程PDF是您学习和使用CMake的最佳资源之一。它提供了全面的指南和示例,以帮助您轻松地创建和管理C++项目。如果您正在寻找一个跨平台的构建工具,CMake是一个强大且易于使用的选择。 ### 回答2: CMake是一种跨平台的编译工具,可以自动生成各种不同编译工具所需的构建文件,从而方便地进行代码构建和编译。CMake教程PDF可以帮助开发者学习CMake的使用方法,并使用其进行代码构建。 本教程的内容主要包括: 1. CMake的安装和配置 2. CMake的基础语法和命令 3. CMake的高级用法,如常用变量、构建选项、条件编译等 4. CMake和其他工具的集成,如Qt、CTest、CPack等 通过学习本教程,开发者可以快速掌握CMake的使用方法,提高代码构建效率和可维护性,同时也能了解到CMake与其他工具的集成方式。 总的来说,CMake教程PDF对于学习和使用CMake构建代码的开发者来说非常实用和有价值,是学习CMake的必要参考资料。 ### 回答3: CMake是一种跨平台自动化构建工具,使开发人员可以轻松地生成跨平台可执行文件、库和测试。CMake教程PDF 是一份详细的指南,可以帮助任何开发人员从头开始学习如何使用CMake构建自己的项目。 该教程从基础开始,将CMake的核心概念和语法解释清楚,同时还提供了完整的示例和演示工程,可以帮助读者深入理解CMake的内部机制,掌握高级用法和技巧。此外,还介绍了在不同操作系统和编译器上使用CMake的最佳实践和常见问题的解决方案。 该教程的用语简单明了,非常适合初学者和有C++编程经验的人读。它涵盖了CMake的许多方面,包括构建系统的设计、源代码管理、测试、安装、交叉编译等。它还介绍了CMake如何与其他构建工具和库集成,例如Boost、Qt、Eigen等。 总之,CMake教程PDF 是一本非常实用的指南,能够帮助开发人员了解和使用CMake来有效地构建他们的项目,并解决可能遇到的问题。如果您想更深入地了解 CMake的使用,那么这本教程一定是必备的读物。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码力码力我爱你

创作不易,小小的支持一下吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值