使用Cmake编译项目从入门到精通

news2024/10/1 3:31:07

文章目录

  • 1、安装
  • 2、使用CMake生成makefile
    • 2.1、项目结构介绍
    • 2.2、编写CMakeLists.txt文件
    • 2.3、优化写法1
    • 2.4、给可执行程序设置路径
    • 2.5、指定头文件目录
    • 2.6、制作库以及使用
  • 3、使用练习

cmake 的特点主要有:
1,开放源代码,使⽤类BSD 许可发布。http://cmake.org/HTML/Copyright.html
2,跨平台,并可⽣成native 编译配置⽂件,在Linux/Unix 平台,⽣成 makefile,在苹果平台,可以⽣
成xcode,在 Windows 平台,可以⽣成 MSVC 的⼯程⽂件。
3,能够管理⼤型项⽬,KDE4 就是最好的证明。
4,简化编译构建过程和编译过程。Cmake 的⼯具链⾮常简单:cmake+make。
5,⾼效虑,按照KDE 官⽅说法,CMake 构建KDE4 的 kdelibs 要⽐使⽤autotools 来构建
KDE3.5.6 的 kdelibs 快40%,主要是因为 Cmake 在⼯具链中没有libtool。
6,可扩展,可以为cmake 编写特定功能的模块,扩充cmake 功能。

1、安装

# 1、卸载老版本的cmake
apt-get autoremove cmake

# 2、文件下载解压
wget https://cmake.org/files/v3.9/cmake-3.9.1-Linux-x86_64.tar.gz
tar zxvf cmake-3.9.1-Linux-x86_64.tar.gz

# 3、创建软链接
mv cmake-3.9.1-Linux-x86_64 /opt/cmake-3.9.1
ln -sf /opt/cmake-3.9.1/bin/* /usr/bin/

2、使用CMake生成makefile

2.1、项目结构介绍

当前环境
在这里插入图片描述

创建5个cpp文件分别是加减乘除函数,和main函数,最简单的方式是g++ *.cpp -o app 这种方式进行编译生成可执行程序,现在我们通过cmake来进这个项目进行编译
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2、编写CMakeLists.txt文件

在项目同级目录下创建CMakeLists.txt文件,通过下面三条命令就可以构建出我们的makefile文件了,为了让我们项目目录干净整洁,我们在当前目录下创建一个build目录,然后进入build目录下,执行cmake …

# 指定cmake最低版本
cmake_minimum_required(VERSION 3.0)
# 指定项目名字
project(myadd_test)

# 生成项目的执行程序名字,和源文件(多个可以通过空格和;进行区分)
add_executable(app add.cpp;div.cpp;main.cpp;mult.cpp;sub.cpp)

执行cmake … 之后在build目录下就生成了Makefile文件了,然后执行make就生成我们的可执行程序了
在这里插入图片描述

2.3、优化写法1

上面的写法要是源文件特别多的情况下就会不美观,诞生出通过set命令给变量SRC_LIST进行初始化,然后add_executable通过${}调用这个变量

# 通过set对变量进行初始化
set(SRC_LIST add.cpp;div.cpp;main.cpp;mult.cpp;sub.cpp)
add_executable(app ${SRC_LIST})

这种写法还是不完善,源文件一旦多起来容易出错,并且也不人性化,通过搜索函数去目录下进行搜索,然后保存到变量中(两个函数都是用来去命令进行遍历)

# 搜索目录下的源文件(.c.cpp),存储到后面一个变量中
# 执行cmake后面跟随的路径PROJECT_SOURCE_DIR
aux_source_directory(${PROJECT_SOURCE_DIR} SRC)

# file命令用来搜索目录下源文件,搜索目录
# CMAKE_CURRENT_SOURCE_DIR CMakeLists.txt的路径
# GLOB遍历当前目录
file(GLOB SRC_C ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)

2.4、给可执行程序设置路径

可以通过set对宏进行初始化,进行环境设置,表示设置编译器为c++11,下面是给生成的可执行程序指定目录

# 指定c++ 11 c++17  std=c++11
set(CMAKE_CXX_STANDARD 11)
# set(CMAKE_CXX_STANDARD 17)

# 给可执行程序指定路径
set(HOME /root/netmap_test/cmake_stu/build)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)

2.5、指定头文件目录

一般项目中.cpp目录一般存放在src,头文件一般存放在include目录下,下面创建include和src目录,将cpp文件和头文件放入到对应的目录下,并指定头文件目录
在这里插入图片描述

# 指定cmake最低版本
cmake_minimum_required(VERSION 3.0)
# 指定项目名字
project(myadd_test)

aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC)

# 指定头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
add_executable(app ${SRC})

# 指定c++ 11 c++17  std=c++11
set(CMAKE_CXX_STANDARD 11)
# set(CMAKE_CXX_STANDARD 17)

# 给可执行程序指定路径
set(HOME /root/netmap_test/cmake_stu/build)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)

2.6、制作库以及使用

将main.cpp拷贝出来,制作成动态库不需要测试程序

在这里插入图片描述

# 指定cmake最低版本
cmake_minimum_required(VERSION 3.0)
# 指定项目名字
project(myadd_test)

# 搜索目录下的源文件(.c.cpp),存储到后面一个变量中
# 执行cmake后面跟随的路径PROJECT_SOURCE_DIR
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC)

# 指定头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)

# 指定c++ 11 c++17  std=c++11
set(CMAKE_CXX_STANDARD 11)


# 生成库,指定库名称,指定为动态库,指定需要生产库的文件
# add_library(calc SHARED ${SRC})

# 指定生产库的路径
set(LIBRARY_OUTPUT_PATH /root/netmap_test/cmake_stu/build)
# 静态库
add_library(calc STATIC ${SRC})

在这里插入图片描述

在这里插入图片描述
静态库和动态库调用
在这里插入图片描述

# 指定cmake最低版本
cmake_minimum_required(VERSION 3.0)
# 指定项目名字
project(myadd_test)

# 搜索目录下的源文件(.c.cpp),存储到后面一个变量中
# 执行cmake后面跟随的路径PROJECT_SOURCE_DIR
aux_source_directory(${PROJECT_SOURCE_DIR} SRC)

# 指定头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)

# 指定c++ 11 c++17  std=c++11
set(CMAKE_CXX_STANDARD 11)

# 指定静态库
link_libraries(calc)
# 指定库目录地址
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/build)
add_executable(app ${SRC})

3、使用练习

# 1、创建文件夹
mkdir -r cmake_test/t1
cd cmake_test/t1
vi main.c

内容:
#include <stdio.h>
int main()
{
	printf(“Hello World from t1 Main!\n”); return 0;
}

CMakeLists.txt

# cmake最低版本号要求
cmake_minimum_required(VERSION 2.8)
# 工程,他不是执行文件名
project(hello-world)
# 手动加入文件
set(SOURCE_FILES main.c)

message(STATUS "This is BINARY dir " ${PROJECT_BINARY_DIR})
#message(SEND_ERROR "darren is error")
message(STATUS "This is SOURCE dir " ${PROJECT_SOURCE_DIR})

# 生产执行文件名hello-world hello
add_executable(hello-world ${SOURCE_FILES})
ADD_EXECUTABLE(hello ${SOURCE_FILES})

使用cmake生成makefile

# 1、(注意命令后⾯的点号,代表本⽬录)。
cmake . 
# 再让我们看⼀下⽬录中的内容, 你会发现,系统⾃动⽣成了:
# CMakeFiles, CMakeCache.txt, cmake_install.cmake 等⽂件,并且⽣成了 Makefile.

# 2、生成可执行文件
make
# 如果你需要看到make 构建的详细过程,可以使⽤make VERBOSE=1 或者VERBOSE=1 make 命令来进⾏构建。

# 3、执行
./hello

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

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

相关文章

网络技术二十一:ACL包过滤

ACL包过滤 ACL 定义 访问控制列表 用于数据流的匹配和筛选 常见功能 访问控制&#xff1a;ACLPacket-filter 路由控制&#xff1a;ACLRoute-policy 流量控制&#xff1a;ACLQOS 引入 ACL (Access Control List&#xff0c;访问控制列表)是用来实现数据包识别功能的 ACL可…

知名设计师推荐:2023年Pantone年度年度色彩用法

绘画巨头Pantone已宣布他们2023年的年度色彩。它是Viva品红&#xff0c;一种如此大胆和充满活力的色彩&#xff0c;我们一想到就兴奋不已。 Viva品红&#xff1a;Pantone Color Institute 2023年的年度色彩是明亮、温暖和乐观的。它也是相关的和不可避免的&#xff1b;在经历了…

浙大陈越何钦铭数据结构08-图7 公路村村通【循环和最小堆版】

题目 现有村落间道路的统计数据表中&#xff0c;列出了有可能建设成标准公路的若干条道路的成本&#xff0c;求使每个村落都有公路连通所需要的最低成本。 输入格式: 输入数据包括城镇数目正整数N&#xff08;≤1000&#xff09;和候选道路数目M&#xff08;≤3N&#xff09;…

.netcore对传输类设置区分大小

.Net Core中内置了对Json的转化与解析 可将PropertyNameCaseInsensitive false 设置为区分大小写。

socket的使用 | 服务器与客户端之间传送数据

服务器端代码&#xff1a; import java.io.*; import java.net.ServerSocket; import java.net.Socket;public class theServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket new ServerSocket(9999); // 该行代码作用&#xff1…

IGES在线查看与转换

IGES 格式最初由美国空军开发并于 1980 年发布。该格式是集成计算机辅助制造 (ICAM) 项目的产品,该项目旨在通过集成操作来降低制造成本。 IGES 文件旨在允许航空航天相关设计在不同平台上传输,同时将数据丢失降至最低。 在 IGES 格式出现之前,不同公司创建的 CAD 和计算机…

PPT怎么转换为PDF格式,收藏这两个在线工具。

PPT是一种常用的演示文稿格式&#xff0c;它可以包含丰富的动画效果和超链接&#xff0c;让你的内容更加生动和有趣。但是&#xff0c;如果你想将PPT分享给别人&#xff0c;或者在不同的设备上查看&#xff0c;你可能会遇到一些问题&#xff0c;比如&#xff1a; PPT文件太大&a…

按照xml文件和txt文件名,将对应名字的图象文件复制

按照xml文件和txt文件名&#xff0c;将对应名字的图象文件复制 需求分析解决方案 需求分析 就是已经标注了xml和txt文件&#xff0c;需要将其对应的图象文件挑选出来 解决方案 # 按照xml文件删除对应的图片 # coding: utf-8 from PIL import Image, ImageDraw, ImageFont imp…

【多线程】线程安全与线程同步

线程安全与线程同步 1.什么是线程安全问题&#xff1f; 多个线程同时操作同一个共享资源的时候&#xff0c;可能会出现业务安全问题 取钱的线程安全问题场景&#xff1a; 两个人他们有一个共同的账户&#xff0c;余额是10万元&#xff0c;如果两个人同时来取钱&#xff0c;…

国内某头部理财服务提供商基于白鲸调度系统建立统一调度和监控运维

导读&#xff1a;国内某头部理财服务提供商成立于 2019 年&#xff0c;是股份制银行中首批获准筹建、首家获准开业、首家成立的银行理财子公司。自 2004 年推出国内首支人民币理财产品以来&#xff0c;通过投资模式的不断创新和投资管理能力的持续提升&#xff0c;引领国内银行…

Vue2项目练手——通用后台管理项目第七节

Vue2项目练手——通用后台管理项目 用户管理分页使用的组件Users.vuemock.js 关键字搜索区Users.vue 权限管理登录页面样式修改Login.vue 登录权限使用token对用户鉴&#xff0c;使用cookie对当前信息保存&#xff08;类似localstorage&#xff09;Login.vuerouter/index.js 登…

go基础08-map的内部实现

和切片相比&#xff0c;map类型的内部实现要复杂得多。Go运行时使用一张哈希表来实现抽象的map类型。运行时实现了map操作的所有功能&#xff0c;包括查找、插入、删除、遍历等。在编译阶段&#xff0c;Go编译器会将语法层面的map操作重写成运行时对应的函数调用。 下面是大致的…

07-垃圾收集算法详解

上一篇&#xff1a;06-JVM对象内存回收机制深度剖析 1.分代收集理论 当前虚拟机的垃圾收集都采用分代收集算法&#xff0c;这种算法没有什么新的思想&#xff0c;只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代&#xff0c;这样我们就可以根据各…

【LeetCode-中等题】17. 电话号码的字母组合

文章目录 题目方法一&#xff1a;递归回溯 题目 方法一&#xff1a;递归回溯 参考讲解&#xff1a;还得用回溯算法&#xff01;| LeetCode&#xff1a;17.电话号码的字母组合 首先可以画出树图&#xff1a; 先将数字对应的字符集合 加入到一个map集合 这里需要一个index来控…

【vue2第十七章】VueRouter 编程式导航跳转传参(点击按钮跳转路由和如何传递参数)

如何在js进行跳转路由 在一些需求中&#xff0c;我们需要不用点击a标签或者router-link&#xff0c;但是也要实现路由跳转&#xff0c;比如登陆&#xff0c;点击按钮搜索跳转。那么这种情况如何进行跳转呢&#xff1f; 直接再按钮绑定的方法中写this.$router.push(路由路径)即…

软件兼容性测试怎么做?对软件产品起到什么作用?

软件兼容性测试是一项重要的软件测试活动&#xff0c;它可以确保在不同操作系统、硬件配置和软件环境下&#xff0c;软件能够正常运行&#xff0c;并与其他相关软件和系统进行正确的互动。 一、软件兼容性的测试方法 1、操作系统测试&#xff1a;测试软件在不同操作系统上的兼…

linux常用命令及解释大全(二)

目录 前言 一、文件的权限 二、文件的特殊属性 三、打包和压缩文件 四、查看文件内容 五、文本处理 5.1 grep 5.2 sed 5.3 其它 总结 前言 本篇文章接linux常用命令及解释大全&#xff08;一&#xff09;继续介绍了一部分linux常用命令&#xff0c;包括文件的权限&a…

Android签名查看

查看签名文件信息 第一种方法&#xff1a; 1.打开cmd&#xff0c;执行keytool -list -v -keystore xxx.keystore&#xff0c;效果如下图&#xff1a; 第二种方法: 1.打开cmd&#xff0c;执行 keytool -list -v -keystore xxxx.keystore -storepass 签名文件密码&#xff0…

Linux 下 C语言版本的线程池

目录 1. 线程池引入 2. 线程池介绍 3. 线程池的组成 4. 任务队列 5. 线程池定义 6. 头文件声明 7. 函数实现 8. 测试代码 1. 线程池引入 我们使用线程的时候就去创建一个线程&#xff0c;这样实现起来非常简便&#xff0c;但是就会有一个问题&#xff1a;如果并发的线程数…

壁炉在文学和艺术中的代表着什么呢,能给我们带来什么样的影响?

壁炉&#xff0c;不仅仅是家庭温暖的来源&#xff0c;也是文学和艺术中常见的重要元素。它的形象在文学作品、绘画和电影中频繁出现&#xff0c;不仅为故事情节提供了背景&#xff0c;还象征着情感、温馨和安全感。让我们一起深入探讨壁炉在文学和艺术中的形象&#xff0c;以及…