cmake入门

​ 参考自Eglinux 的 CMake 练级攻略。

一、例子

  • 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:执行可执行文件
  • 结果

image.png

image81e702249c7920c5.png


二、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);
}

image8dbd70a8b949635d.png

  • 这里
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值