{"id":26575591,"url":"https://github.com/qwli7/cmake","last_synced_at":"2025-03-23T02:19:35.672Z","repository":{"id":276902577,"uuid":"930662593","full_name":"qwli7/cmake","owner":"qwli7","description":"cmake 学习教程","archived":false,"fork":false,"pushed_at":"2025-03-18T12:59:01.000Z","size":27,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-18T13:47:21.225Z","etag":null,"topics":["cmake","cmakelists","cpp","cpp11"],"latest_commit_sha":null,"homepage":"","language":"CMake","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qwli7.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-11T02:05:57.000Z","updated_at":"2025-03-18T12:59:05.000Z","dependencies_parsed_at":null,"dependency_job_id":"57883551-39dc-4ed6-8946-fc56a4cd8527","html_url":"https://github.com/qwli7/cmake","commit_stats":null,"previous_names":["qwli7/cmake"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qwli7%2Fcmake","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qwli7%2Fcmake/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qwli7%2Fcmake/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qwli7%2Fcmake/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qwli7","download_url":"https://codeload.github.com/qwli7/cmake/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245045021,"owners_count":20551964,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cmake","cmakelists","cpp","cpp11"],"created_at":"2025-03-23T02:19:35.139Z","updated_at":"2025-03-23T02:19:35.634Z","avatar_url":"https://github.com/qwli7.png","language":"CMake","funding_links":[],"categories":[],"sub_categories":[],"readme":"## `CMake` 官方学习文档\n\n翻译采用个人习惯进行翻译\n\n- [Step01 一个基本的入口点](Step01/README.md)\n- [Step02 添加库](Step02/README.md)\n- [Step03 添加库的使用依赖](Step03/README.md)\n\n## `CMake` 命令行工具\n安装好 `CMake` 后，将 `bin` 目录添加到环境变量中，通过 `cmake --version` 来验证是否安装成功 \n### 生成工程\n进入到顶层 `CMakeLists.txt` 文件夹下，执行 `cmake .` 指令（默认生成的是 `VS` 工程代码，如果你的电脑上安装了 `VS`）\n```shell\ncmake .\n```\n### 指定生成平台\n通过 `-G` 选项，可以指定生成平台，例如生成 `MinGW Makefiles`\n```shell\ncmake . -G \"MinGW Makefiles\"\n```\n\n### 构建\n利用生成的工程进行构建\n```shell\ncmake --build .  \n```\n\n其他命令可以通过 `cmake --help` 查看具体的用法\n\n## `CMake` 常用指令\n\n[CMake命令官网地址](https://cmake.org/cmake/help/latest/manual/cmake-commands.7.html)\n\n- `cmake_minimum_required(VERSION \u003cversion\u003e)` 指定运行此 `CMakeLists.txt` 文件的最低 `CMake` 版本\n- `project(\u003cproject_name\u003e [\u003clanguage\u003e ...])` 设定项目名称和语言，也可设置版本号等，运行时会设置 `CMAKE_PROJECT_NAME` 属性\n    - 执行后，内置四种变量\n        - `\u003cPROJECT-NAME\u003e_VERSION_MAJOR` 主版本\n        - `\u003cPROJECT-NAME\u003e_VERSION_MINOR` 次版本\n        - `\u003cPROJECT-NAME\u003e_VERSION_PATCH`\n        - `\u003cPROJECT-NAME\u003e_VERSION_TWEAK`  \n    ```cmake\n    # project(\u003cproject_name\u003e [VERSION \u003cmajor\u003e[.\u003cminor\u003e[.\u003cpatch\u003e[.\u003ctweak\u003e]]]])\n    # 执行后，内置四种变量\n    project(cmake_demo VERSION 3.1.2.1)\n\n    message(STATUS ${${CMAKE_PROJECT_NAME}_VERSION_MAJOR}) #3\n    message(STATUS ${${CMAKE_PROJECT_NAME}_VERSION_MINOR}) #1\n    message(STATUS ${${CMAKE_PROJECT_NAME}_VERSION_PATCH}) #2\n    message(STATUS ${${CMAKE_PROJECT_NAME}_VERSION_TWEAK}) #1\n    ```\n\n- `add_executable(\u003ctarget\u003e \u003csource_files\u003e...)` 指定要生成的可执行文件和源文件\n    ```cmake\n        add_executable(MyExecutable main.cpp other_file.cpp)\n    ```\n- `add_library(\u003ctarget\u003e \u003csource_files\u003e...)` 创建一个库文件（静态库或者动态库，默认是静态库）\n    ```cmake\n    add_library(MyLibrary STATIC library.cpp) #静态库，不指定 STATIC，也默认为 STATIC\n    add_library(MyLibrary SHARED library.cpp) #共享库，动态库\n\n    #可以定义 BUILD_SHARED_LIBS 这个属性，告诉 cmake 当这个属性开启时，不指定会默认构建成动态库\n    option(BUILD_SHARED_LIBS \"Building using shared libraries\" ON) \n\n    ```\n- `target_link_libraries(\u003ctarget\u003e \u003clibraries\u003e...)`  链接目标文件和其他库\n    ```cmake\n    target_link_libraries(MyExecutable MyLibrary) \n    ```\n- `include_directories(\u003cdirs\u003e...)` 添加头文件搜索路径\n    - 使用该属性后，目录会被填充到 `INCLUDE_DIRECTORIES` 中，生成器将使用该属性为编译器设置包含目录（头文件目录）\n    - 推荐使用 `target_include_directories()` 替代，可以设置依赖关系\n    ```cmake\n    include_directories(${PROJECT_SOURCE_DIR}/include)\n    ```\n- `target_include_directories(\u003ctarget\u003e \u003cINTERFACE|PUBLIC|PRIVATE\u003e [items1...] \u003cINTERFACE|PUBLIC|PRIVATE\u003e [items2...]...)` 给目标添加包含目录\n    - 编译给定的目标时，指定包含目录；多次调用会被追加\n    - `target` 必须是被 `add_executable()` 或者 `add_library()` 命令创建的对象\n    - `PUBLIC` `INTERFACE` `PRIVATE` 指明了后面参数传递的范围\n \n\n- `set(\u003cvariable\u003e \u003cvalue\u003e...)` 设置变量的值\n\n- `option(\u003cvariable\u003e \"\u003chelp_text\u003e\" [value])` 提供一个选项值，OFF是默认值，该值一旦被设置后，将会被缓存；\n\n- `configure_file(\u003cinput\u003e \u003coutput\u003e)` 从 input 拷贝文件到 output，\n    - input 路径是从 `CMAKE_CURRENT_SOURCE_DIR` 开始\n    - output 输出路径默认是从 `CMAKE_CURRENT_BINARY_DIR` 处理，可以指定输出路径\n    ```cmake\n    configure_file(common.h.in, common.h); //common.h 放置到可执行文件同级目录\n    configure_file(common.h.in, \"include/common.h\"); //可执行文件创建文件夹\n    ```\n\n- `message([\u003cmode\u003e] \"message text...\")` 打印日志，`mode` 通常设置为 `STATUS` 即可，常见的可以参考 [message mode 定义](https://cmake.org/cmake/help/latest/command/message.html)\n    ```cmake\n    message(STATUS \"hello world\"); //打印消息\n    ```\n- `aux_source_directory(\u003cdir\u003e \u003cvariable\u003e)` 查找源文件，指定的目录中  \n    ```cmake\n    aux_source_directory(. SRC_LIST) # 从当前的目录中，查找所有的源文件，放到 SRC_LIST 中\n    message(STATUS ${SRC_LIST})\n    ```\n- `add_subdirectory(source_dir [binary_dir])`  向生成添加一个子目录，默认添加到可执行文件的生成目录中\n    ```cmake\n    # MyFunctions/CMakeLists.txt 中\n    add_library(MyFunc STATIC myfunction.cpp) # 添加一个静态库\n    target_include_directories(MyFunc INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) # 默认把头文件也包含进去\n    \n    # CMakeLists.txt\n    add_subdirectory(MyFunctions) # 把 MyFunctions 这个目录添加到可执行文件目录下\n    add_executable(cmake_project main.cpp)\n    target_link_libraries(cmake_project MyFunc) #链接 MyFunc 这个库，给可执行文件\n\n    ```\n\n-  `target_compile_features(\u003ctarget\u003e \u003cPRIVATE|PUBLIC|INTERFACE\u003e \u003cfeature\u003e [....])` 给编译器提供特征\n    ```cmake\n    # 这里的设置是全局的，假设我这里设置了标准为 11 ，但是代码中使用 17 提供的 string_view，构建就会报错\n    # set(CMAKE_CXX_STANDARD 11)\n    # set(CMAKE_CXX_STANDARD_REQUIRED true)\n    ```\n   ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqwli7%2Fcmake","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqwli7%2Fcmake","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqwli7%2Fcmake/lists"}