CMakeLists.txt 语法介绍

news2024/11/15 23:34:25

CMake编译原理

CMake是一种跨平台编译工具,主要编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库.因此CMake的编译基本就两个步骤:cmake && make

cmake 指向的是CMakeLists.txt所在的目录,cmake会生成很多编译中间文件和makefile文件. 我们一般在使用中. 会用out-of-source方式构建,新建一个文件夹, 文件夹名字随意, 习惯命名为build; 依次执行以下命令


cd build 
cmake .. (表示CMakeLists.txt在当前目录的上一级目录中)
make

常见命令

#1.cmake verson,指定cmake版本,可选项
cmake_minimum_required(VERSION 2.8)

#2.project name,指定项目的名称,可选项, 一般和项目的文件夹名称对应
PROJECT(demo)

#3.提供ON和OFF选项, 若没有初始值, 则使用OFF

OPTION (ENABLE_UNITTEST "Unit Test" OFF) 

#4.message  显示一条消息. STATUS=非重要信息;WARNING=CMake 警告,会继续执行;*AUTHO*R_WARNING = CMake 警告 (dev), 会继续执行;*SEND*_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;*FATAL*_ERROR = CMake 错误, 终止所有处理过程;在 stdout 上显示 STATUS 消息,在 stderr 上显示其他所有消息

MESSAGE(STATUS ENABLE_UNITTEST=${ENABLE_UNITTEST}) 

IF(ENABLE_UNITTEST)

  #启用测试;

    ENABLE_TESTING()

ENDIF()

#5 .设置 C++ 编译选项,也可以通过指令 add_definitions() 添加,add_definitions(-DENABLE_DEBUG -DABC) # 参数之间用空格分隔

SET(CMAKE_CXX_FLAGS "-fPIC -Wall -Wno-deprecated -std=c++11")



#6.添加子工程

SET(CommonDir ${CMAKE_CURRENT_SOURCE_DIR}/common)

ADD_SUBDIRECTORY(${CommonDir} common.out)

#7.头文件目录
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)

#8.将指定路径下所有的源代码文件存储在一个变量中;
AUX_SOURCE_DIRECTORY(. SRC_LIST) #将当前CMakeLists.txt目录下所有.cpp文件保存到SRC_LIST变量中

#9.GLOB为所有匹配表达式的文件生成一个文件list. 并将该list存储进变量variable.  如*.proto匹配所有扩展名为proto的文件

FILE(GLOB FILE_PROTOS "*.proto")

#10.foreach循环FILE_PROTOS列表中的每一项. FIL存放每一轮循环时列表中该项的值; 

FOREACH(FIL ${FILE_PROTOS})

   #10.1ABS_FIL 保存获取部分的变量;  获取文件绝对路径

    GET_FILENAME_COMPONENT(ABS_FIL ${FIL} ABSOLUTE)

   #10.2获取文件父路径

    GET_FILENAME_COMPONENT(FIL_WE ${FIL} NAME_WE)

    #10.3添加新element到list中

    LIST(APPEND PROTO_SRCS "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc")

    #10.4执行多个子进程

    EXECUTE_PROCESS(

    )

ENDFOREACH()



#11.生成可执行文件
ADD_EXECUTABLE(${PROJECT_NAME} demo.cpp) #生成可执行文件: demo

#12.生成静态库/共享库

ADD_LIBRARY(test STATIC test.cpp) #静态库 libtest.a

ADD_LIBRARY(test SHARED test.cpp) #动态库/共享库 libtest.so



#13.add link library,添加可执行文件所需要的库,比如我们用到了libmt.so(命名规则:lib+name+.so),就添加该库的名称
TARGET_LINK_LIBRARIES(${PROJECT_NAME} mt)

一个小demo
在这里插入图片描述

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

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

相关文章

MySQL基础练习

Ⅰ Ⅱ 3.1 3.2 3.3 3.4 -- 单表查询练习 /* 素材 CREATE TABLE emp ( empno int(4) NOT NULL, ename varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, job varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, …

细数那些Compose新手容易犯的错误

作者:晴天小庭 笔者作为一个日常Jetpack Compose开发者,对Compose的理解也在逐渐加深中,最近回顾当初学习和实践的过程中,犯了不少错误和踩了很多坑,本篇文章作为小总结分享给大家,同时文章会持续更新&…

Leetcode-每日一题【1669.合并两个链表】

题目 给你两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个。 请你将 list1 中下标从 a 到 b 的全部节点都删除,并将list2 接在被删除节点的位置。 下图中蓝色边和节点展示了操作后的结果: 请你返回结果链表的头指针。 示例 1…

Unity游戏C# dll注入

案例游戏下载 首先在网上下载个游戏案例,我就以Captain Molly游戏为例。 这个游戏玩家默认生命值有5点,咱们通过dll注入修改为10点。 dnSpy 我使用dnSpy来查看Unity游戏生成的dll代码,当然你们也可以使用其他工具。 Unity游戏脚本代码最终…

Codeforces-Round-883-Div-3

Codeforces Round 883 (Div. 3) 链接:https://codeforces.com/contest/1846 A. Rudolph and Cut the Rope There are n n n nails driven into the wall, the i i i-th nail is driven a i a_i ai​ meters above the ground, one end of the b i b_i bi​ m…

Pinia: vue的最新状态管理库

Pinia: vue的最新状态管理库,vuex状态管理工具的替代品。 pinia官方文档 注意defineStore()的返回值还是一个方法,所以useCounterStore是一个方法,执行该方法得到一个对象。 getters: 异步action: storeToRefs: 补充 vuex&#xff…

20中文字符识别(matlab程序)

1.简述 随着计算机科学的飞速发展,以图像为主的多媒体信息迅速成为重要的信息传递媒介,在图像中,文字信息(如新闻标题等字幕) 包含了丰富的高层语义信息,提取出这些文字,对于图像高层语义的理解、索引和检索非常有帮助…

Zero-Shot Node Classification

零样本节点分类(Zero-shot node classification) 谱图卷积 图卷积网络 GCN的分解

pandas中比较两个对象相等性 .eq()函数

在使用pandas做数据分析时,往往我们会有这样的数据需求:为某有某一属性的客户打标签。此刻,.eq()函数,就可以实现它自身的价值。 Lets go,一起去探索它的神秘力量吧! 先讲讲它的用途:可以用于…

银河麒麟高级服务器系统部署-尚文网络xUP楠哥

进Q群11372462领取专属报名福利! # 什么是银河麒麟 银河麒麟高级服务器操作系统是针对企业级关键业务,适应虚拟化、云计算、大数据、工业互联网时代对主机系统可靠性、安全性、性能、扩展性和实时性等需求,依据CMMI5级标准研制的提供内生本质安全、云原…

Pandas理论与实战(一)

目录 一、Series对象 1.1 认识Series对象 1.2 Series对象的索引 1.3 获取Series的索引和值 二、DataFrame对象 2.1 认识DataFrame对象 2.2 DataFrame重要属性和函数 ​三、导入外部数据 3.1 导入.xls或.xlsx文件 3.2 导入csv文件 3.3 导入.txt文本文件 3.4 导入HTML网页…

Sentinel组件限流降级

官网: home | Sentinel 文档不是很全, 关于nacos的配置中心的使用完全没有 常见的限流算法 静态窗口限流: 即规定1秒内只能固定处理多少请求动态窗口限流: 同样是规定1秒内处理多少请求, 但是统计方式与第一个不同, 比如2.5秒则是统计1.5秒到现在的请求数漏桶限流: 进来可以…

【全栈第三课】通过ChatGPT快速入门NodeJS

前言 往期全栈课程: Vue从入门到精通 微信小程序从入门到精通 Node.js基础 简介 Node.js是什么? Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O的模型,使其轻量又高效。Node.js …

迎接高考的倒计时网页(❤️好看好用❤️)HTML+CSS+JS

✨博主:命运之光 🌸专栏:Python星辰秘典 🐳专栏:web开发(简单好用又好看) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主页 前言:欢迎踏入…

并发编程_jmm部分

1. JMM 理解 前提:并发编程有3大问题,可见性、有序性、原子性。 导致可见性的原因是缓存,有序性的原因是 编译器优化。解决方法就是直接禁用缓存和编译器优化,导致程序性能堪忧。 因此合理的方案就是按需禁用缓存和编译器优化。 …

MySQL数据库——单表查询练习

一、练习素材 创建表 CREATE TABLE emp (empno int(4) NOT NULL,ename varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,job varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,mgr int(4) NULL DEFAULT NULL,hireda…

遗传算法核心理解,python代码

遗传算法的核心,就在于,把待求的变量转化成二进制串,二进制串就像dna,可以对它的其中某几位进行交换,变异等操作,然后再转换回十进制,带入目标函数,计算适应度,保留适应度…

【lambda函数】lambda()函数

lambda() lambda()语法捕捉列表mutable lambda 底层原理函数对象与lambda表达式 lambda()语法 lambda表达式书写格式: [capture-list] (parameters) mutable -> return-type{ statement }咱…

【数据结构】排序:插入排序与希尔排序详解

本章开始就要分享一些常用的排序方法,我们的日常生活中很多地方都要使用排序,比如电商平台可以按照你的需求进行排序,或者是你想了解大学的综合排名时 我们之前也学到过一些简单的排序比如冒泡排序,虽然他在时间复杂度上可以说是依…

归并排序(思路+代码)

变量: left、right、privot、temp[]、leftIndex、k 思路: 代码: import java.util.Arrays;public class Queue8 {public static void main(String[] args) {int[] arr {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};sort(arr,0,arr.length-1);System.ou…