一、例子
- CMake是一个跨平台的自动化构建工具,可以根据源代码生成不同平台下的可执行程序、静态库、共享库等。
- CMake最大的特点是能够实现跨平台的构建流程,并且使用简单的语法来描述构建过程,因此在不同的操作系统和编译器上都可以很方便地使用。
- 源程序
first.c
#include<stdio.h>
int main(int argc, char const *argv[])
{
printf("hello cmake!\n");
return 0;
}
CMakeLists.txt
# 指定cmake的最低版本
cmake_minimum_required(VERSION 3.16.3 FATAL_ERROR)
# 指定项目名称、版本和编程语言
project(MyProj VERSION 0.1.0 LANGUAGES CXX C)
# 生成可执行文件
add_executable(MyProj first.c)
- 当前目录下执行
cmake .:生成Makefile和其它文件make:执行makefile文件./MyProj:执行可执行文件
- 结果


二、cmake入门
注意:
[ ]的内容可选,其余必须要
1.指定cmake的最低版本
cmake_minimum_required(VERSION <major>[.<minor>[.<patch>[.<tweak>]]])
如:
cmake_minimum_required(VERSION 3.14)
# FATAL_ERROR可选:CMake在找不到所需的最小版本时会立即停止构建过程,并输出一条致命错误消息
cmake_minimum_required(VERSION 3.16.3 FATAL_ERROR)
2.指定项目属性
- 项目名称、版本号、编程语言
# 只有项目名是必须的,其余是可选的,不写则用默认(C++和C)
project(<projectname>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[LANGUAGES <language-name>...])
如:
project(MyProj)
# CXX是一个CMake变量,用于指定 C++ 编译器的路径或名称。是CMAKE_CXX_COMPILER变量(内置)的简写。
# 这里指定是C语言和C++
project(MyProj VERSION 0.1.0 LANGUAGES CXX C)
3.构建target
3.1 生成可执行文件
target_name是要创建的可执行文件的名称source1,source2,等是要编译的源代码文件WIN32: 该参数指示可执行文件应该被标记为 Windows 应用程序。MACOSX_BUNDLE: 该参数指示可执行文件应该打包成一个 macOS 应用程序。EXCLUDE_FROM_ALL: 该参数指示如果使用make命令编译项目,则不应编译此目标。
add_executable(target_name [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
如:
add_executable(my_program main.cpp Math.cpp)
3.2 创建静态库或动态库
target_name是要创建的库的名称source1,source2, 等是要编译的源代码文件STATIC: 该参数指示创建静态库。SHARED: 该参数指示创建动态库(共享库)MODULE: 该参数指示创建插件库(仅适用于 macOS)
# 三个可选参数只能选一个或不选(默认静态库)
add_library(target_name [STATIC | SHARED | MODULE]
source1 [source2 ...])
如:
# 构建一个静态库
add_library(my_library STATIC foo.cpp bar.cpp)
3.3 target 链接
- 语法
target_link_libraries(targetName
<PRIVATE|PUBLIC|INTERFACE> item1 [item2 ...]
[<PRIVATE|PUBLIC|INTERFACE> item3 [item4 ...]]
...
)
-
targetName必须是一个由add_executable()或者add_library()命令创建的 Target 的名字。 -
items1 item2 …:各种待链接的库 -
PRIVATEtargetName会链接PRIVATE选项后的 iterms 指定的这些库这些库- 只有 targetName 这个 Target 本身需要这些库
- 其他任何链接 targetName 这个 Target 的其他 Target 都不知道这些 iterms 的存在。
-
PUBLIC- 不止 targetName 本身这个 Target 需要这些 iterms
- 其他链接到 targetName 的 Target 也需要依赖这些 iterms,并链接这些 iterms。
-
INTERFACE- targetName 本身不需要这些 iterms
- 但是其他链接 targetName 的 Target 需要依赖这些 iterms,并链接这些 iterms。
如:连接sqlite3(已经安装该数据库,配置环境变量)
cmake_minimum_required(VERSION 3.16.3)
project(my_project)
set(CMAKE_CXX_STANDARD 11)
# 查找SQLite3库的地址并存储到变量SQLite3
find_package(SQLite3 REQUIRED)
# 打印头文件地址和链接库地址
message("SQLite3 include dir: ${SQLite3_INCLUDE_DIRS}")
message("SQLite3 libraries: ${SQLite3_LIBRARIES}")
# 添加可执行文件
add_executable(my_executable main.c)
# 将SQLite3库链接到可执行文件
target_link_libraries(my_executable ${
SQLite3_LIBRARIES})
main.c
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
int main(int argc, char* argv[])
{
sqlite3 *db;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("test.db", &db);
if( rc ){
fprintf(stderr, "连接数据库失败: %s\n", sqlite3_errmsg(db));
exit(0);
}else{
fprintf(stderr, "连接打开数据库成功\n");
}
sqlite3_close(db);
}

- 这里

本文是CMake的入门教程,涵盖了指定cmake版本、项目属性、构建target、变量、字符串和列表操作等内容,旨在帮助开发者理解和使用CMake进行跨平台构建。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



