CMakeLists.txt 基础

CMake 是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile(通过 make 命令进行项目的构建),大多是IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake等,如果自己动手写 makefile,会发现,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。

而 CMake 恰好能解决上述问题, 其允许开发者指定整个工程的编译流程,在根据编译平台, 自动生成本地化的Makefile和工程文件 ,最后用户只需 make 编译即可,所以可以把CMake看成一款自动生成 Makefile的工具。

一、最简单的CMakeLists.txt

1、CMake的注释

1.1 行注释

CMake 使用 # 进行 行注释

# 这是一个 CMakeLists.txt 文件
cmake_minimum_required(VERSION 3.1.0)

1.2 块注释

CMake 使用 #[[ ]] 进行块注释

#[[ 这是一个 CMakeLists.txt 文件。
这是一个 CMakeLists.txt 文件
这是一个 CMakeLists.txt 文件]]
cmake_minimum_required(VERSION 3.0.0)

2、cmake_minimum_required

cmake_minimum_required:指定使用的 cmake 的最低版本。

用法:cmake_minimum_required(最低版本号)

cmake_minimum_required(VERSION 3.10)
    "3.10" 是 CMake 的最低版本号。这一行代码告诉 CMake 最低所需的版本号,CMake 会检查你所使用的 CMake 版本是否		满足最低要求。如果你的 CMake 版本低于指定的版本,那么 CMake 将停止构建并给出错误信息

3、project

project:定义工程名称,并可指定工程的版本、工程描述,如果不需要是可以忽略的,只需要指定出工程名字即可。

用法:project(工程名称)

cmake_minimum_required(VERSION 3.10)
project(app)

project(app) 是 CMake 的一个指令,用于定义项目的名称。在这里,app 是项目的名称,你可以根据需要修改为你实际的项目名称。

通过使用 project 指令,你可以告诉 CMake 构建系统关于你的项目的一些基本信息,例如项目的名称、版本号、支持的语言等。这些信息对于 CMake 在生成构建文件时非常重要。

实际上,project 指令还可以带上其他可选参数,可以更详细地指定项目的属性,例如:

project(app
        VERSION 1.0
        DESCRIPTION "A sample CMake project"
        LANGUAGES CXX)

这里,我们除了指定项目的名称为 app 外,还指定了项目的版本号、描述和所使用的编程语言(在此示例中是 C++)。这些信息可以作为元数据用于构建生成的项目文件和工程文件。

请注意,在一个 CMakeLists.txt 文件中只能出现一次 project 指令,用于定义项目的主要信息。如果你的项目包含多个子目录或子项目,可以在每个子目录的 CMakeLists.txt 文件中使用 project 指令来定义子项目的信息。

4、add_executable()

add_executable:定义工程生成一个可执行程序

用法1:add_executable(可执行程序名 源文件1名称 源文件2名称 源文件3名称)

用法2: add_executable(可执行程序名 源文件1名称;源文件2名称;源文件3名称)

cmake_minimum_required(VERSION 3.10) 
project(app)
add_executable(app add.c sub.c div.c mult.c main.c) 
#注意这里的可执行程序名和project中的项目名没有任何关系

5、简单的CMakeLists.txt示例

在这里我们使用具体文件做示例:

5.1 编写文件 add.c sub.c mult.c div.c head.h main.c CMakeLists.txt

add.c

#include <stdio.h>
#include "head.h"
const char* libVersion = "Library Version 1.0";
int add(int a,int b)
	return a+b;

sub.c

#include <stdio.h>
#include "head.h"
int subtract(int a,int b)
	return a-b;

mult.c

#include <stdio.h>
#include "head.h"
int multiply(int a,int b)
	return a*b;

div.c

#include <stdio.h>
#include "head.h"
double divide(int a,int b)
	return (double)a/b;

head.h

#ifndef _HEAD_H
#define _HEAD_H
int add(int a,int b);
int subtract(int a,int b);
int multiply(int a,int b);
double divide(int a,int b);
#endif

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(app) 
add_executable(app add.c sub.c div.c mult.c main.c) 

目录结构如下:

5.2执行cmake

cmake ./

执行过程如下:

此时目录下生成很多文件,可以看到一个Makefile

执行make生成app

此时已成功编译出可执行文件app

6、将目标文件放进文件夹的CMakeList.txt

通过上面的例子可以看出,如果在CMakeLists.txt文件所在目录执行了cmake命令之后就会生成一些目录和文件(包括 makefile 文件),如果基于makefile文件执行make命令,程序在编译过程中还会生成一些中间文件和一个可执行文件,这样会导致整个项目目录看起来很混乱,不太容易管理和维护,此时我们就可以把生成的这些与项目源码无关的文件统一放到一个对应的目录里边,比如将这个目录命名为build:

继续使用以上的源文件进行测试:

mkdir build
cd build
cmake ../

过程如下,可以看到所有的cmake过程文件都生成在build的文件夹中了,这样使顶层目录更加整洁:

CMake 是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile(通过 make 命令进行项目的构建),大多是IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake等,如果自己动手写 makefile,会发现,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。而 CMake 恰好能解决上述问题, 其允许开发者指定整个工程的编译流程,在根据编译平台,
本资源对应下方博客4.7小节。通过CMakeLists.txt 构建好的 VTK 可运行工程 vtk2 文件夹(可实现Cube工程示例中的Demo(立方体)的显示和交互) 具体可前往我的CSDN博客“Win10-64位(或Win7)+VS2019+ITK4.13.2+VTK8.2+CMake3.16环境配置” 查看安装教程与效果!
使用vcpkg和CMake (使用CMakeLists.txt或CMakeSettings.json )构建C ++软件。 提供的示例使用自托管或Microsoft托管代理,还使用Docker和管道缓存。 强烈建议将vcpkg用作子模块。 在下面的示例中,其中vcpkg是一个Git子模块: # Sample when vcpkg is a submodule # Cache/Restore the vcpkg's build artifac
我们平时编译程序时,所使用的各种IDE已经帮你规划好编译流程,但这样编译可控性不好,有时不能按照自己的意愿编译,并且有些IDE不能跨平台,需要重新建工程,很不方便。而CMake可以解决以上问题,特别是在Linux上使用更加方便。 接下来是CMake最简单的也是基本的使用流程: 一、编写CMakeLists.txt # CMake最低版本要求 cmake_minimum_required(VERSI...
利用Essential c++ ch2中冒泡排序法作为例,搭建相关的CMakeLists结构。主要涉及,程序结构、静态库的建立、库与目标文件建立联系、各个变量以及关键字的使用与注意事项。 一、CMakeLists编写细节 二、程序框架 Essential CMakeLists.txt bubble_sort CMake project(json_test) find_package(jsoncpp CONFIG REQUIRED) message("json config file path: ${jsoncpp_CONFIG}") get_target_property(JSON_INC_PATH jsoncpp_lib INTERFACE_INCLUDE_DIRECTORIES) include_directories( ${CMAKE
CMake简介: CMake是一种跨平台的开源项目管理工具,所做的事其实就是告诉编译器如何去编译链接源代码。与之相似的是直接编写makefile文件,但makefile最大的缺点就是不能跨平台,一旦更换环境就要重新编写,于是我们可以使用CMake编写CMakeLists文件来解决此问题。 检查是否安装CMake 首先检查是否安装CMake,在终端输入cmake --version来检查,若显示未安...
原因:同事使用qt .pro链接库资源路径都写死了,更换机器非常麻烦,想到使用cmake方式来代替.pro方式,查阅了很多方式,解决了更换机器每次都要调整路径的麻烦…… cmakelist.txt cmake_minimum_required(VERSION 2.8) set(CMAKE_BUILD_TYPE Debug) project(xxx) find_package(Qt5Core REQUIRED) find_package(Qt5Widgets REQUIRED) find_pack
CMak可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接拿到其它平台上使用,只需要少量的修改,非常方便。camke的主要特点:安装cmake的命令: 查看cmake版本号的命令: 三、简单样例 学习编程的最简单的案例—打印Hello World 3.1 创建main.c的命令 3.2 在main.c文件中,粘贴以下代码 3.3 创建CMakeLists.txt(文件名是CMakeLists.tx
对于大型的 C++ 项目,可能需要将代码分为多个模块,并使用多个 CMakeLists.txt 文件来管理它们。下面是一个使用多个 CMakeLists.txt 文件来管理 C++ 多文件项目的示例: 假设我们有以下项目结构: myproject/ ├── CMakeLists.txt ├── module1/ │ ├── CMakeLists.txt │ ├── include/ │ │ └── module1.h │ └── src/ │ └── module1.cpp └── module2/ ├── CMakeLists.txt ├── include/ │ └── module2.h └── src/ └── module2.cpp 其中,`myproject` 目录下的 `CMakeLists.txt` 文件是主 CMakeLists.txt 文件,它用于管理整个项目。`module1` 目录和 `module2` 目录是两个子模块,每个子模块都有自己的 `CMakeLists.txt` 文件、头文件和源文件。 现在,我们需要使用 CMake 来构建这个项目。我们可以在 `myproject` 目录下创建一个主 CMakeLists.txt 文件,并添加以下内容: ```cmake cmake_minimum_required(VERSION 3.10) project(myproject) # 添加子目录 add_subdirectory(module1) add_subdirectory(module2) 该 CMakeLists.txt 文件指定了项目的最低 CMake 版本和项目名称。`add_subdirectory` 命令用于添加子目录,它告诉 CMake 去处理 `module1` 和 `module2` 这两个子目录中的 CMakeLists.txt 文件。 接下来,我们需要在 `module1` 目录下创建一个名为 `CMakeLists.txt` 的文件,并添加以下内容: ```cmake # 添加头文件搜索路径 include_directories(include) # 添加源文件 add_library(module1 src/module1.cpp) # 暴露头文件 target_include_directories(module1 PUBLIC include) 该 CMakeLists.txt 文件指定了 `module1` 子模块的构建规则。`include_directories` 命令添加了头文件搜索路径,它告诉 CMake 在 `include` 目录中查找头文件。`add_library` 命令编译 `module1.cpp` 源文件并生成一个静态库文件 `libmodule1.a`。最后,`target_include_directories` 命令将 `include` 目录暴露给其他模块,以便它们可以包含 `module1.h` 头文件。 然后,在 `module2` 目录下创建一个名为 `CMakeLists.txt` 的文件,并添加以下内容: ```cmake # 添加头文件搜索路径 include_directories(include) # 添加源文件 add_library(module2 src/module2.cpp) # 暴露头文件 target_include_directories(module2 PUBLIC include) 该 CMakeLists.txt 文件指定了 `module2` 子模块的构建规则,与 `module1` 子模块类似。 完成以上步骤后,我们可以使用以下命令来构建项目: ```bash mkdir build cd build cmake .. `mkdir build` 创建了一个构建目录,`cd build` 进入该目录,`cmake ..` 命令使用上面的主 CMakeLists.txt 文件来构建项目,`make` 命令编译源代码并生成可执行文件。 这就是一个使用多个 CMakeLists.txt 文件来管理 C++ 多文件项目的示例