一、例子
- 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 …
:各种待链接的库 -
PRIVATE
targetName
会链接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);
}
- 这里