自动构建之CMake

news/2024/11/15 3:32:26/

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.ppmy.cn/news/74219.html

相关文章

DM8_dminit初始化工具介绍及使用

dminit介绍: dminit 是 DM 数据库初始化工具。在安装 DM 的过程中,用户可以选择是否创建初始 数据库。如果当时没有创建,那么在安装完成之后,可以利用创建数据库工具 dminit 来创建。可以利用 dminit 工具提供的各种参数&#xff…

smb配置,详细图文及配置

samba :网络文件共享服务 ​ Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,而SMB是Server Message Block的缩写,即为服务器消息块,SMB主要是作为Microsoft的网络通讯协议,后来Samba将SMB通信协议应用到了Linux系统上…

我们为什么还要学习Altium Designer?

Altium Designe(简称“AD”)是电子设计领域中备受推崇的软件工具之一,拥有强大的功能和灵活的设计环境,也是要用最广泛的EDA工具之一,为电子工程师提供了无限可能,但很多工程师学完AD基本操作就转投其他EDA…

elementUI,自定义表头,多层级表头,表头合并,行内容一致的合并行

先上效果: 1.自定义表头: 通过设置 slot"header" 来自定义表头。 slot-scope"scope" 这一行千万不要因为没有再template中使用到scope,vscode报红而删除,这会导致input框不能输入任何内容! &l…

react函数组件常用的几个钩子函数

react框架 react框架包括包括两大类:类组件函数组件。 类组件构成:constructor自定义方法。调用方法通过this.方法名()。constructor(superstate)构造器里面必有super字段。render()方法里面写页面布局。 函数组件构成:各种钩子函数return()方…

Android 系统内的守护进程 - main类服务(7) : sdcard

声明 只要是操作系统,不用说的就是其中肯定会运行着一些很多守护进程(daemon)来完成很多杂乱的工作。通过系统中的init.rc文件也可以看出来,其中每个service中就包含着系统后台服务进程。而这些服务被分为:core类服务(adbd/servicemanager/healthd/lmkd/logd/vold)和mai…

在Window10和Window11系统,WPF使用Viewport3D 渲染失败问题解决方案

最近遇到个棘手的问题:在供应商提供的戴尔optiplex 3000的12代处理器主机的集成显卡Intel(R) UHD Graphics 770上使用Viewport3D 渲染失败(3D模型显示不了,或者是显示不全),之前开发验证使用的是集成显卡Intel(R) UHD …

【大数据模型】LeonardoAi让心中所想跃然纸上

汝之观览,吾之幸也! 本文主要聊聊LeonardoAi绘图工具 一、注册Discord账号 不管LeonardoAi还是midjourney,都需要注册一个Discord账号,Discord是一个社区软件,在这里可以进行讨论和交流使用心得 LeonardoAi官网地址 …