当前位置: 首页 > news >正文

【CMake】CMake构建C++代码(一)

在Linux开发过程中,难免会用到CMake来构建你的代码。本文将说明如何构建自己的代码,将自己的代码变为共享库,共其他代码使用。

文章目录

    • 在Linux开发过程中,难免会用到CMake来构建你的代码。本文将说明如何构建自己的代码,将自己的代码变为共享库,共其他代码使用。
  • CMake简述
  • 一、构建你的第一个CMake工程
    • 2.1 工程结构
    • 2.2 文件内容
  • 三、开始构建
  • 四、构建后build文件夹结构
  • 五、安装共享库
  • 六、总结


(关注“测试开发自动化” 弓中皓,获取更多学习内容)

CMake简述

如果有朋友在Linux端使用C/C++/Fortran/Java这几种语言开发,相信对CMake构建工具不会陌生,也是大多数程序员必须掌握的一项代码构建技能。
之所以Cmake会进入大多数程序员的视线,为大多数程序员使用,主要是因为CMake主要有如下特点:

  1. 原生支持 C/C++/Fortran/Java 的相依性的自动分析功能,免除了程序员对代码依赖的调整,对整个开发工作帮助很大。
  2. 支持 SWIG、Qt、FLTK 开发框架。
  3. 支持跨平台编译,这是CMake名字的来源。
  4. CMake需要用户用CMake规范的语法编写CMake脚本,该语法简单易用,入门极其顺手。
  5. 能够转换特殊平台的 IDE 项目文档,如xcode。
  6. 与Dart、CTest 和 CPack 集成,可以组成自动化的构建系统。

需要注意的是:使用CMake,程序员必需编写好CMake脚本CMAkeLists.txt,对于一些复杂的项目,可能需要编写CMake模块,但对于构建过程而言,则是极其简单的。


一、构建你的第一个CMake工程

首先,要是知道,一个标准工程,文件夹的结构应该是这样的:

  1. doc文件夹:存放工程的文档
  2. src文件夹:存放源文件
  3. bin文件夹:存放构建后的目标文件

好了,下面我们就来搭建一个简单的工程使用CMake来构建!,我们构建的前提都是在Linux系统下进行示例的。因此,大家学习的时候最好在Linux系统下学习。

2.1 工程结构

我们在自己的Linux系统的home路径下(或你自己的系统)创建一个它文件夹,并在对应的文件夹下建立对应的文件。整个t3文件夹的结构如下所示:

 t3
├── build
├── CMakeLists.txt
└── lib├── CMakeLists.txt├── hello.cpp└── hello.h

2.2 文件内容

上面创建了空的文件,下面我们就要对文件中的内容进行补充:

  1. t3/CMakeLists.txt文件:

project(hellolib) # 工程名
add_subdirectory(lib) # 在工程目录下(build文件夹)生成一个lib文件夹,并将动态、静态文件存储在build/lib文件夹下

  1. t3/lib/CMakeLists.txt文件:

set(LIBHELLO_SRC hello.cpp)
add_library(hello SHARED ${LIBHELLO_SRC}) # 生成一个hello.so的动态库文件
add_library(hello_static STATIC ${LIBHELLO_SRC}) # 生成一个hello_static.o的静态库文件
#为使生成的动态库和静态库名称一致,需要使用 set_target_properties
set_target_properties(hello_static PROPERTIES OUTPUT_NAME “hello”) # 将hello_static重命名为hello# 可得到libhello.so 和 libhello.a
set_target_properties(hello PROPERTIES VERSION 1.2 SOVERSION 1) # 设置生成的.so的版本为1.2
INSTALL(TARGETS hello hello_static # 将动态库libhello.so、libsello.a安装到/usr/lib中
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
)
INSTALL(FILES hello.h DESTINATION include/hello) # 将头文件安装到/usr/include/hello中

  1. hello.cpp文件:
#include <iostream>
void HelloFunc()
{std::cout << "hello world"<< std::endl;
}
  1. hello.h文件:
#ifndef HELLO_H
#define HELLO_H
#include <iostream>
void HelloFunc();
#endif

三、开始构建

这里主要采用的是外部构建的方式。外部构建即在将构建的信息生成在build文件夹中,也是极力推荐这样构建,所以内部构建这里就不作过多的解释。
在终端中输入如下Linux指令:

cd build
cmake .. && make

四、构建后build文件夹结构

构建后,build文件夹结构如下所示:


build
├── CMakeCache.txt
├── CMakeFiles
├── cmake_install.cmake
├── Makefile
└── lib├── CMakeFiles├── cmake_install.cmake├── Makefile├── libhello.a        # set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello") ├── libhello.so       # set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello") ├── libhello.so.1     # set_target_properties(hello PROPERTIES VERSION 1.2 SOVERSION 1)└── libhello.so.1.2   # set_target_properties(hello PROPERTIES VERSION 1.2 SOVERSION 1)

五、安装共享库

如果你希望其他人可以直接仅通过.h文件即可调用的你的代码,那么你就需要安装共享库。作用是:将头文件和共享库安装到系统目录/usr/lib 和/usr/include/hello,可以直接通过include<hello.h>的方式使用(相当于Windows的环境变量)。在build文件夹下输入:

make install

六、总结

至此,我们就完成了我们的共享库的构建,后续会讲解如何使用共享库来运行我们的代码。

(关注“测试开发自动化” 弓中皓,获取更多学习内容)

在这里插入图片描述

相关文章:

【CMake】CMake构建C++代码(一)

在Linux开发过程中&#xff0c;难免会用到CMake来构建你的代码。本文将说明如何构建自己的代码&#xff0c;将自己的代码变为共享库&#xff0c;共其他代码使用。 文章目录在Linux开发过程中&#xff0c;难免会用到CMake来构建你的代码。本文将说明如何构建自己的代码&#xff…...

让我们,从头到尾,通透I/O模型

什么是IO 一句话总结 IO就是内存和硬盘的输入输出 I/O 其实就是 input 和 output 的缩写&#xff0c;即输入/输出。 那输入输出啥呢&#xff1f; 比如我们用键盘来敲代码其实就是输入&#xff0c;那显示器显示图案就是输出&#xff0c;这其实就是 I/O。 而我们时常关心的磁盘…...

Word控件Spire.Doc 【Table】教程(16):C#/VB.NET:在 Word 表格中插入或提取图像

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…...

C++如何实现系统语言切换功能,MessageBox的确认/取消按钮语言显示如何跟程序一致

文章目录前言 一、新建工程二、添加多国语言的资源三、程序语言设置四、语言切换五、字符串处理六、MessageBox的问题七、相关函数和类型参考文章前言 目前很多软件都是要出口到多个国家&#xff0c;多个地区&#xff0c;因此&#xff0c;为软件提供多国语言支持就成为了一个基…...

计算机组成原理学习笔记:循环冗余校验码

循环冗余校验码 CRC 码 循环冗余校验码 (cyclic redundancy Check, CRC) 十进制除法 从熟悉的十进制出发&#xff0c;假设现在你要给另一个人传送882这样的一个10进制数据&#xff0c;为了防止传送数据的过程中某一个数据发生错误你可以和你的另一个小伙伴约定一个除数&…...

Educational Codeforces Round 143 (Rated for Div. 2) A — C

Educational Codeforces Round 143 (Rated for Div. 2) 文章目录A. Two Towers题目大意题目分析codeB. Ideal Point题目大意题目分析codeC. Tea Tasting题目大意题目分析codeA. Two Towers 题目大意 有两个有红蓝两种颜色组成的塔&#xff0c;每次操作可以将其中一个塔顶的色…...

【Unity VR开发】结合VRTK4.0:将浮点数从交互器传递到可交互对象

语录&#xff1a; 愿你熬得过万丈孤独&#xff0c;藏得下星辰大海。 前言&#xff1a; 默认情况下&#xff0c;交互器只能将单个布尔操作传递给可交互对象&#xff0c;后者控制可交互对象上的抓取操作。在其他时候&#xff0c;交互器中的其他操作可能希望传递给可交互对象&…...

【图像分类】基于PyTorch搭建卷积神经网络实现MNIST手写数字识别(附项目完整代码)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 在【图像分类】基于PyTorch搭建LSTM实现MNIST手写数字体识别(单向LSTM,附完整代码和数据集)文章中,我们使用了…...

4.4 MQC

1. 实验目的 熟悉MQC的应用场景掌握MQC的配置方法2. 实验拓扑 实验拓扑如图4-10所示: 图4-10:MQC 3. 实验步骤 (1) IP地址的配置 AR1的配置 <Huawei>system-view...

ClickHouse列存储(十一)—— ClickHouse

文章目录一、重点内容&#xff1a;1.数据库基本概念2.列式存储3.clickHouse存储设计4.clickHouse典型应用场景二、准备工作&#xff1a;1、了解数据库基本概念2、了解列式存储相关概念3、了解ClickHouse存储设计4、了解 ClickHouse典型应用场景三、详细知识点介绍&#xff1a;1…...

公司来了个卷王,真让人奔溃

2022年已经结束结束了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;相信很多小伙伴也在准备今年的金三银四的面试计划。 在此展示一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友可以好好刷一刷&#xff0c;还是挺有必要的&#xff0c;它几乎涵盖了所有的…...

什么是refresh?Spring refresh 流程

refresh 是 AbstractApplicationContext 中的一个方法&#xff0c;负责初始化 ApplicationContext 容器&#xff0c;容器必须调用 refresh 才能正常工作。它的内部主要会调用 12 个方法&#xff0c;我们把它们称为 refresh 的 12 个步骤&#xff1a;1. prepareRefresh2. obtain…...

Python登陆系统

前言 #源码见文末公众号哈# 登录系统 一个简单的登录系统包含了登录账户、注册账户、修改密码以及注销账户的操作。 1. 登录账户 登录系统主要需要判断账户是否存在&#xff0c;不存在就注册一个账户&#xff0c;如果第一次登录系统&#xff0c;我们需要先新建一个文件&…...

【新2023】华为OD机试 - 重组字符串(Python)

华为 OD 清单查看地址:blog.csdn.net/hihell/category_12199275.html 重组字符串 题目 给定一个非空字符串 S,其被 N 个‘-’分隔成 N+1 的子串,给定正整数 K, 要求除第一个子串外,其余的子串每 K 个字符组成新的子串,并用‘-’分隔。 对于新组成的每一个子串,如果它…...

视频监控流程图

<html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"/> <link rel"stylesheet" type"text/css" href"visio.css"/> <title> 视频监控流程图 </title> <…...

普通单双面板的生产工艺流程之图形转移,华秋一文告诉你

衔接上文&#xff0c;继续为朋友们分享普通单双面板的生产工艺流程。 如图&#xff0c;第五道主流程为图形转移。 图形转移的目的为&#xff1a; 利用光化学原理&#xff0c;将图形线路的形状转移到印制板上&#xff0c;再利用化学原理&#xff0c;将图形线路在印制板上制作出…...

1.8 providers

生成providersnest g service <name>providers的注入方式构造函数注入Injectable() export class KeywordService {constructor(private readonly httpService: HttpService,private readonly pro: ProService,) {} }Inject()注入export class KeywordController {Inject…...

如何编写一个基本的 Verilog Module(模块)

1、概述这篇文章主要介绍了 Verilog 在 FPGA 设计中的概念和使用方法。首先讨论使用模块&#xff08;module&#xff09;关键字构造 Verilog 设计的方式&#xff0c;以及这与所描述的硬件的关系。这包括对参数、端口&#xff08;port&#xff09;和例化&#xff08;instantiato…...

让乔布斯想要「发动核战争」的 Android,为何成了占有率最高的系统?

2008 年 9 月 23 日&#xff0c;Apple 的创始人和 CEO 史蒂夫乔布斯像往常一样走进了公司&#xff0c;此时距离初代 iPhone 的发布会才过了一年半&#xff0c;这款充满了争议的产品就像一块从山崖滚落的巨岩&#xff0c;一路电光石火的给手机市场的《小石潭记》来了场焚书坑儒。…...

FPGA开发软件(vivado + modelsim)环境搭建(附详细安装步骤+软件下载)

本文详细介绍了vivado软件和modelsim软件的安装&#xff0c;以及vivado中配置modelsim仿真设置&#xff0c;每一步都加文字说明和图片。一、软件安装包下载1、vivado vivado版本很多&#xff0c;目前最新的已更新到vivado2022.2&#xff0c;版本越高&#xff0c;安装包越大&…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...