自动构建之CMake

news2025/2/28 20:06:49

CMake

链接: 自动构建之MakeFile

CMake也是一种用于自动化构建软件项目的工具。Cmake可以自动输出MakeFile文件,并且CMake是一个跨平台的构建系统,对于复杂的、跨平台的项目,CMake可能是一个更好的解决方案。

CMake的脚本文件是在CMakeLists.txt中,例如

在这里插入图片描述

# 单个目录实现
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 工程,他不是执行文件名
PROJECT(0VOICE)
# 手动加入文件 ${变量名}} ,比如${SRC_LIST}
SET(SRC_LIST main.c)
SET(SRC_LIST2 main2.c)
# MESSAGE和echo类似 
MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR})

# 生产执行文件名0voice  0voice2
ADD_EXECUTABLE(0voice ${SRC_LIST})
ADD_EXECUTABLE(0voice2 ${SRC_LIST2})

在当前文件夹下可以使用**cmake .**来编译代码。编译完之后会生成我们的MakeFile文件。

在这里插入图片描述

但是这样生成的中间文件太多了,和代码文件混在一个文件夹中。更常见的做法是,首先在目录下创建一个build文件夹,然后在build文件夹下执行**cmake …**来编译文件。

在这里插入图片描述

语法

示例:

cmake_minimum_required(VERSION 2.6)
PROJECT(loginserver)

AUX_SOURCE_DIRECTORY(./ SRC_LIST)

#SET(LIBRARY_OUTPUT_PATH ./)
SET(EXECUTABLE_OUTPUT_PATH  ./)
if(APPLE)
    SET(PB_LIB_DIR ../base/pb/lib/mac)
elseif(UNIX)
    SET(PB_LIB_DIR ../base/pb/lib/linux)
endif()

ADD_DEFINITIONS( -g -W -Wall -D_REENTRANT -D_FILE_OFFSET_BITS=64 -DAC_HAS_INFO
-DAC_HAS_WARNING -DAC_HAS_ERROR -DAC_HAS_CRITICAL -DTIXML_USE_STL
-DAC_HAS_DEBUG -DLINUX_DAEMON -std=c++11)

INCLUDE_DIRECTORIES(./ ../base ../base/pb/protocol ../base/jsoncpp/ ../base/pb/ ../protobuf/include)
LINK_DIRECTORIES(./ ../base ${PB_LIB_DIR} ../base/slog/lib)

#ADD_XXXX必须在TARGET_LINK_LIBRARIES前面,否则会报错
#ADD_LIBRARY(${PROJECTNAME} SHARED/STATIC ${SRC_LIST})
ADD_EXECUTABLE(login_server ${SRC_LIST})

TARGET_LINK_LIBRARIES(login_server base protobuf-lite slog pthread)
  • PROJECT(loginserver):定义工程名称为loginserver;
  • AUX_SOURCE_DIRECTORY(./ SRC_LIST):将当前目录所有源代码文件存储在SRC_LIST中。
  • SET(EXECUTABLE_OUTPUT_PATH ./):定义变量EXECUTABLE_OUTPUT_PATH为./;这里目的是保存一个文件夹地址。
  • SET(PB_LIB_DIR …/base/pb/lib/linux):将变量PB_LIB_DIR 定义为…/base/pb/lib/linux;这里目的也是保存一个文件夹地址。
  • ADD_DEFINITIONS( -g -W -Wall -D_REENTRANT -D_FILE_OFFSET_BITS=64 -DAC_HAS_INFO
    -DAC_HAS_WARNING -DAC_HAS_ERROR -DAC_HAS_CRITICAL -DTIXML_USE_STL
    -DAC_HAS_DEBUG -DLINUX_DAEMON -std=c++11):向编译器添加编译选项和预处理器定义。
    • -g:生成的可执行文件会带调试信息,生成调试执行文件时使用
    • -W:启用所有编译器警告
    • -Wall:启用几乎所有编译器警告
    • -D_REENTRANT:定义宏,表示使用多线程支持的库函数版本。
    • -D_FILE_OFFSET_BITS=64:定义宏,表示使用64位文件偏移量。
    • -DAC_HAS_INFO:定义宏,启用信息级别的日志记录。
    • -DAC_HAS_WARNING :定义宏,启用警告级别的日志记录。
    • -DAC_HAS_ERROR :定义宏,启用错误级别的日志记录。
    • -DAC_HAS_CRITICAL :定义宏,启用关键级别的日志记录。
    • -DTIXML_USE_STL:定义宏,表示使用C++标准库(STL)版本的TinyXML库。
    • -DAC_HAS_DEBUG :定义宏:表示启用某些调试级别的日志记录。
    • -DLINUX_DAEMON :定义宏,表示程序将作为Linux守护进程运行。
    • -std=c++11:指定使用C++11标准进行编译。
  • INCLUDE_DIRECTORIES(./ …/base …/base/pb/protocol …/base/jsoncpp/ …/base/pb/ …/protobuf/include):引入多个头文件搜索路径。引入的是一些非标准(非系统头文件)的头文件。
  • LINK_DIRECTORIES(./ …/base ${PB_LIB_DIR} …/base/slog/lib):引入非标准的库文件搜索路径。
  • ADD_EXECUTABLE(login_server ${SRC_LIST}):定义这个工程会生成一个文件名为login_server 的可执行文件,相关的源文件是SRC_LIST中定义的源文件目录。
  • TARGET_LINK_LIBRARIES(login_server base protobuf-lite slog pthread)::为将生成的可执行文件添加需要链接的共享库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/556216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能Python-python_can

Python-CAN: 一个用于控制CAN总线通信的Python工具 什么是CAN总线? Controller Area Network(CAN)是用于控制器之间通信的一种通信协议。它经常用于汽车、工业自动化和机器人等领域。CAN总线可以连接多个设备,这些设备可以通过总…

离谱,入职比亚迪一个月,我算是开眼了..

去年校招寒冬很多人都收到BYD的offer,看多了把BYD当爷爷拜的分享了,这里我就做个坏人来泼盆冷水。 以下情况仅仅适用于我从同部门同事和室友了解到的,至于这种情况适不适用于整个厂,就看各位怎么理解了。 当然也不是硬黑硬洗&am…

力扣sql中等篇练习(二十四)

力扣sql中等篇练习(二十四) 1 商店中每个成员的级别 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 SELECT m.member_id,m.name,case when t.r is null then Bronzewhen t.r>0 AND t.r<50 then …

使用CMake+vcpkg生成VS2022工程——以开源库openMVS为例

使用CMakevcpkg生成VS2022工程——以开源库openMVS为例 背景 想在openMVS应用的基础上做一些改造&#xff0c;于是下载了其开源代码。为了改造它&#xff0c;首先要了解程序执行流程&#xff0c;要是能在VS里以debug模式来运行就好了&#xff01; 过去接触的开源软件/库的编译…

Codeforces Round 835 (Div. 4) Tutorial (zh)

题目链接 A. Medium Number 题意&#xff1a; 给三个数 a , b , c a,b,c a,b,c&#xff0c;找出中间的那个数 eg. a ≤ b ≤ c a \leq b \leq c a≤b≤c 输出 b b b Example input 9 5 2 6 14 3 4 20 2 1 1 2 3 11 19 12 10 8 20 6 20 3 4 1 3 19 8 4output 5 4 2 2 12 10 …

[Nacos] Nacos Client获取调用服务的提供者列表 (四)

文章目录 1.Nacos Client获取调用服务的提供者列表1.1 从Ribbon的负载均衡入手到Nacos Client获取调用服务的提高者列表1.2 getServers方法返回分析1.3 通过selectInstances方法查找Instances实例1.4 获取到要调用服务的serviceInfo Nacos Client 从Ribbon负载均衡调用服务。 …

无公网IP,SSH远程连接Linux CentOS

转载自cpolar内网穿透的文章&#xff1a;无公网IP&#xff0c;SSH远程连接Linux CentOS【内网穿透】 本次教程我们来实现如何在外公网环境下&#xff0c;SSH远程连接家里/公司的Linux CentOS服务器&#xff0c;无需公网IP&#xff0c;也不需要设置路由器。 视频教程 【SSH远程…

汇编十二、定时/计数器

1、功能 定时器/计数器的核心部件是一个加法(也有减法)的计数器&#xff0c;其本质是对脉冲进行计数。只是计数脉冲来源不同&#xff1a;如果计数脉冲来自系统时钟&#xff0c;则为定时方式&#xff0c;此时定时器/计数器每12个时钟周期或者每6个时钟周期得到一个计数脉冲&…

Sentinel简介和安装

1.Sentinel简介 官方Github 官方中文文档Github 官方文档 1.1.Sentinel 是什么&#xff1f; 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 …

HTB-Agile

HTB-Agile 信息收集80端口漫长的兔子洞之旅 立足www-data -> corumcorum -> edwardsedwards -> root 信息收集 80端口 漫长的兔子洞之旅 我注意到系统为我分配了一个session&#xff0c;是以eyj开头的。 拿去jwt.io看看。 额&#xff0c;可能后面会用先留在这&#…

实验5 单选多选、进度条、图像显示等组件使用

实验内容和步骤 以下习题需要自己设计界面内容&#xff0c;尽量丰富&#xff0c;并且突出创新和亮点&#xff0c;不可简单仿照例题。 1.设计并实现音乐播放器的进度条界面。 2.设计并实现含有多选控件的界面。 3.设计并实现含有单选控件的界面。 4.设计并实现含有图像显示的界…

华为OD机试真题 Java 实现【去除多余空格】【2023Q1 200分】

一、题目描述 去除文本多余空格&#xff0c;但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标&#xff0c;去除多余空格后刷新关键词的起始和结束下标。 条件约束&#xff1a; 不考虑关键词起始和结束位置为空格的场景&#xff1b;单词的的开始和结束下标保证…

springboot项目:瑞吉外卖 前后端 代码、思路 详细分析 part6

part1 part2 part3 part4 part5 part6(本页) 7. 菜品展示、购物车、下单 功能开发 7.1 导入用户地址簿相关功能代码 7.2 菜品展示 7.3 购物车 7.4 下单 7.1 导入用户地址簿相关功能代码 7.1.1 整体分析 需求分析 数据模型需要开发的模块&#xff1a;新增收获地址、设置默认…

【Mysql】初识 Mysql

文章目录 【Mysql】初识 Mysql数据库初识主流关系型数据库理解数据库mysql基本操作连接服务器理解服务器&#xff0c;数据库&#xff0c;表关系小案例数据逻辑存储 mysql架构sql分类存储引擎 【Mysql】初识 Mysql 数据库初识 数据库概念 数据库是“按照数据结构来组织、存储和…

v-model使用及原理

关于v-model&#xff0c;vue2与vue3用法不一致&#xff0c;本文学习采用了vue3官网文档。与vue2区别写在本文末尾。一、为什么使用v-model&#xff1f; v-model指令可以在表单input、textarea以及select元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素…

马哈鱼SQLFLow直接数据流介绍

直接数据流介绍 本文将介绍一些生成直接数据流的SQL元素&#xff0c;这些元素是生产数据流的主要原型。 1、Select 示例语句&#xff1a; SELECT a.empName "eName" FROM scott.emp a Where sal > 1000目标列“eName”的数据来自scott.emp.empName列&#xff…

【安卓源码】安卓app应用进程启动原理

目录 0. 应用app 调用 startActivity 1. AMS 调用 startActivity 方法 2. zygote socket 通信,通知 zygote 创建应用进程 1-1&#xff09; 去fork 一个子进程 Zygote.forkAndSpecialize 1-2&#xff09;执行子进程方法 handleChildProc 1-3&#xff09;执行父进程方法 ha…

用户管理 ---MySQL总结(七)

用户管理 对于MySQL的用户也是需要进行管理&#xff0c;这里的东西类似与Linux的多用户管理&#xff0c;基本相同 用户属性 MySQL的用户都是储存在数据库mysql的user之中。 这里使用desc table_name;查看user表的属性。 desc user;//下面的就是输出的结果host:登陆限制 user…

chatgpt赋能Python-python_ai_app

用Python编写AI应用程序 Python是目前最受欢迎的编程语言之一&#xff0c;被广泛用于各种应用程序的开发。其中&#xff0c;人工智能&#xff08;AI&#xff09;应用程序成为Python编程人员最感兴趣和热门的领域之一。这篇文章将重点介绍用Python编写AI应用程序的好处&#xf…

从零开始Vue3+Element Plus后台管理系统(16)——组合式函数hook二次封装el-table

终于写到组合式函数了&#xff0c;它类似vue2的mixin&#xff0c;但优于mixin&#xff0c;用好了可以事半功倍。 在 Vue 应用的概念中&#xff0c;“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。 官方文档&#xff1a;https://cn.vu…