【CMake】通用的基于CMake的C可执行文件项目CMakeList文件模板

6 篇文章 0 订阅
5 篇文章 0 订阅

CMake相比传统的Makefile之间的关系不需要在这里过多解释,相关介绍也请直接百度。CMake真的非常好用,语法符合人的直觉,工程的管理也方便很多。

话不多说直接给出CMake模板代码

##*************** 基础设置 ********************
## 设置CMake最低版本
cmake_minimum_required(VERSION 3.22)
## 设置项目名称
project(My_Program C)
## 设置C语言标准
set(CMAKE_C_STANDARD 99)
## 详细输出编译信息
set(CMAKE_VERBOSE_MAKEFILE on)

## 添加源文件
file(GLOB_RECURSE SOURCES1 "Source1/*.c")
file(GLOB_RECURSE SOURCES2 "Source2/*.c")

## 添加include路径
include_directories(dir1/include)
include_directories(components/libsqlite3/include)


## *************** 添加静态库 ********************
## 添加静态库路径
link_directories(components/libsqlite3/lib)


## *************** 设置编译参数 ********************
## 指定参与编译的源文件
add_executable(My_Program main.c ${SOURCES1} ${SOURCES2})
## 链接静态库
target_link_libraries(My_Program sqlite3)

CMake负责构建项目,所以需要用CMake特定语法描述哪些文件参与编译,哪些路径要作为include路径以便编译器可以再对应路径下找到被include的头文件,哪些静态库需要被链接进目标程序,以及这些静态库的所在路径,还有那些需要在编译时传递给编译器的一些额外参数,比如全局的宏定义。

如果你使用过Visual Studio或Eclipse之类的这些集成开发环境,你会发现上面的这些选项都是通过IDE的GUI进行配置,只不过CMake项目只使用CMakeList这个文件去描述这些设置,这并不复杂,因为只要记住了并理解这个模板中的语法,对于诸多CMake工程均能通用,因为他是跨平台的。


1.设置CMake最低版本
cmake_minimum_required(VERSION 3.22)

cmake_minimum_required是CMakeLists.txt文件中的一条指令,它用于指定项目所需的最低CMake版本。这个指令告诉CMake,如果运行的CMake版本低于指定版本,它应该发出警告并拒绝生成项目的构建系统,如果你的项目使用了CMake的一些新特性,你可以提高VERSION的值,以确保用户使用符合要求的CMake版本。


2.设置项目名称
project(My_Program C)

这条指令用于定义一个C语言项目并命名该项目为"My_Program"。

具体来说,这条指令有两个参数:

  1. 第一个参数是项目的名称,这里是"My_Program"。这个名称可以在项目的整个CMake文件中使用,用于引用项目。
  2. 第二个参数指定了项目的语言。在这种情况下,语言是"C",表示这个项目是一个纯C语言项目。

通过这个指令,CMake知道了你的项目是一个C语言项目,并且你可以在接下来的CMakeLists.txt文件中使用C语言相关的指令和函数来构建你的项目。


3.设置C语言标准
set(CMAKE_C_STANDARD 99)

在 C 语言中,有一系列的标准规范,每个标准都定义了语言的特性、语法和函数库等。C99 是 C 语言的第 3 个正式标准,于 1999 年发布,引入了一些新的特性和改进。

通过这个指令,告诉 CMake 在构建项目时使用 C99 标准编译 C 语言的源代码。这意味着编译器会按照 C99 标准的规定来解析和编译你的代码。

如果你的项目需要遵循特定的 C 语言标准,你可以使用 set(CMAKE_C_STANDARD <version>) 来设置,其中 <version> 可以是 90、99、11、17 或者其他具体的版本号。


4.详细输出编译信息
set(CMAKE_VERBOSE_MAKEFILE on)

这条语句用来设置生成的编译脚本在运行时是否显示详细信息的指令。

具体来说,当设置为 on 时,它告诉 CMake 在运行构建脚本时显示详细的输出信息,包括编译命令、链接命令等。这对于调试构建过程或者查看详细的编译信息非常有用。

当设置为 off 时,则不会显示详细的信息,只会显示必要的构建过程信息,这样可以使输出更加清晰简洁。

一般来说,在开发过程中,将这个选项设置为 on 可以帮助你更好地了解构建过程中发生的事情,特别是当构建出现问题的时候。


5.添加源文件
file(GLOB_RECURSE SOURCES1 "Source1/*.c")
file(GLOB_RECURSE SOURCES2 "Source2/*.c")

这两条指令用于将指定目录下的所有符合匹配模式的文件添加到变量中。

具体来说,这里的两个指令分别是:

  1. file(GLOB_RECURSE SOURCES1 "Source1/*.c"):这个指令会在 “Source1” 目录下递归地查找所有扩展名为 .c 的 C 语言源代码文件,并将它们的路径保存到名为 SOURCES1 的变量中。这意味着 SOURCES1 变量将包含 “Source1” 目录及其子目录中所有的 .c 文件的路径。
  2. file(GLOB_RECURSE SOURCES2 "Source2/*.c"):这个指令与第一个类似,不同之处在于它将符合条件的 .c 文件搜索的目录是 “Source2”。

这种方式适用于当项目中的源代码文件比较少,并且不太可能在构建过程中频繁地添加或删除源文件时。然而,对于大型项目,更好的做法是手动列出源文件,以确保更好的控制和可维护性。


6.添加include路径
include_directories(dir1/include)
include_directories(components/libsqlite3/include)

这两条指令用于添加头文件搜索路径到编译过程中。

具体来说,这里的两个指令分别是:

  1. include_directories(dir1/include):这个指令将 dir1/include 目录添加到编译器的头文件搜索路径中。这意味着编译器在查找 #include 语句指定的头文件时,会在 dir1/include 目录中查找。
  2. include_directories(components/libsqlite3/include):这个指令将 components/libsqlite3/include 目录添加到头文件搜索路径中,同样是为了让编译器能够找到其中的头文件。

通过这种方式,你可以告诉 CMake 在编译你的项目时应该去哪些目录中查找头文件。这对于包含外部库的头文件或者自己项目中的头文件非常有用,因为它们可以在编译时正确地被引用和解析。


7.添加静态库路径
link_directories(components/libsqlite3/lib)

link_directories(components/libsqlite3/lib) 指令用于添加库文件搜索路径到链接过程中。

具体来说,这个指令将 components/libsqlite3/lib 目录添加到链接器的库文件搜索路径中。这意味着在链接阶段,链接器将在该目录中查找指定的库文件。

通常情况下,当你使用外部库时,你需要告诉链接器库文件的位置,以便在链接过程中正确地引用这些库。通过 link_directories 指令,你可以告诉 CMake 在链接时应该去哪些目录中查找库文件。


8.指定参与编译的源文件
add_executable(My_Program main.c ${SOURCES1} ${SOURCES2})

这条指令用于创建一个可执行文件,并将源文件添加到该可执行文件的构建过程中。

具体来说,这个指令有三个参数:

  1. My_Program:这是你将要创建的可执行文件的名称。在这个例子中,可执行文件的名称是 “My_Program”。
  2. main.c:这是可执行文件的一个源文件。在这个例子中,main.c 文件被指定为可执行文件的一个源文件。
  3. ${SOURCES1}${SOURCES2}:这两个变量包含了额外的源文件。${SOURCES1}${SOURCES2} 是刚才通过 file(GLOB_RECURSE ...) 指令定义的,用于收集特定目录下的所有源文件。这样做的目的是将这些源文件添加到可执行文件的构建过程中。

通过这条指令,CMake 将会创建一个名为 “My_Program” 的可执行文件,并将 main.c 文件以及 ${SOURCES1}${SOURCES2} 中包含的所有其他源文件编译链接到该可执行文件中。


9.链接静态库
target_link_libraries(My_Program sqlite3)

这条指令是在 CMakeLists.txt 文件中使用的,用于指定一个目标(通常是可执行文件或库)需要链接的库。

具体来说,这个指令有两个参数:

  1. My_Program:这是目标的名称,通常是通过 add_executableadd_library 指令定义的可执行文件或库的名称。
  2. sqlite3:这是要链接到目标中的库的名称。在这个例子中,目标 My_Program 将链接到名为 sqlite3 的库。

通过这条指令,CMake 将会确保在构建 My_Program 目标时,链接器会链接 sqlite3 库,使得 My_Program 可以正确地调用 sqlite3 库中的函数或者使用其中的符号。注意这里的静态库要确保以"lib"开头并存在于刚才指定的components/libsqlite3/lib路径下,也就是说components/libsqlite3/lib要存在libsqlite3.a文件才能正确链接

以上就是CMakeList文件的正确写法,祝大家使用得顺利!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值