嵌套的CMake

heheda@linux:~/Linux/multi-v1$ tree
.
├── calc
│   ├── add.cpp
│   ├── CMakeLists.txt
│   ├── div.cpp
│   ├── mult.cpp
│   └── sub.cpp
├── CMakeLists.txt
├── include
│   ├── calc.h
│   └── sort.h
├── sort
│   ├── CMakeLists.txt
│   ├── insert.cpp
│   └── select.cpp
├── test1
│   ├── calc.cpp
│   └── CMakeLists.txt
└── test2├── CMakeLists.txt└── sort.cpp5 directories, 15 files
heheda@linux:~/Linux/multi-v1$ 

1.include 目录:头文件目录

2.calc目录:目录中的四个源文件对应的加/减/乘/除算法

  • 对应的头文件是include中的calc.h

3.sort目录:目录中的两个源文件对应的是插入排序和选择排序算法

  • 对应的头文件是include中的sort.h

4.test1 目录:测试目录,对加、减、乘、除算法进行测试

5.test2 目录:测试目录,对排序算法进行测试

一、calc文件夹 

  • calc的add.cpp
#include <stdio.h>
#include "calc.h"int add(int a, int b)
{return a+b;
}
  • calc的div.cpp 
#include <stdio.h>
#include "calc.h"double divide(int a, int b)
{return (double)a/b;
}
  • calc的mult.cpp 
#include <stdio.h>
#include "calc.h"int multiply(int a, int b)
{return a*b;
}
  • calc的sub.cpp 
#include <stdio.h>
#include "calc.h"// 你好
int subtract(int a, int b)
{return a-b;
}

二、sort文件夹  

  • sort的insert.cpp
#include <iostream>
using namespace std;
void print(int a[], int n)
{for(int j= 0; j<n; j++){cout<<a[j] <<"  ";}cout<<endl;
}void insert(int a[], int n)
{for(int i = 1; i < n; i++) //第一个元素作为基准元素,从第二个元素开始把其插到正确的位置{if(a[i] < a[i-1]) //如果第i个元素比前面的元素小{int j = i-1;     //需要判断第i个元素与前面的多个元素的大小,换成j继续判断int x = a[i]; //将第i个元素复制为哨兵while(j >= 0 && x < a[j]) //找哨兵的正确位置,比哨兵大的元素依次后移{a[j+1] = a[j];j--;}a[j+1] = x;  //把哨兵插入到正确的位置}}
}
  • sort的select.cpp
#include<iostream>
using namespace std;
void print1(int a[], int n)
{for(int j= 0; j<n; j++){cout<<a[j] <<"  ";}cout<<endl;
}void select(int a[], int len)
{int minindex, temp;for(int i = 0; i<len-1;i++){minindex = i;for(int j = i+1; j<len; j++){if(a[j]<a[minindex])minindex = j;}temp = a[i];a[i] = a[minindex];a[minindex] = temp;}
}

三、include文件夹  

  • calc.h
#ifndef _CALC_H
#define _CALC_H
#include <iostream>
using namespace std;
// 加法
int add(int a, int b);
// 减法
int subtract(int a, int b);
// 乘法
int multiply(int a, int b);
// 除法
double divide(int a, int b);
#endif
  • sort.h
#ifndef _SORT_H
#define _SORT_H#include <iostream>
using namespace std;// 插入排序
void print(int a[], int n);
void insert(int a[], int n);// 选择排序
void print1(int a[], int n);
void select(int a[], int len);
#endif

四、test1文件夹  

  • calc.cpp
#include <stdio.h>
#include "calc.h"int main()
{int a = 20;int b = 12;printf("a = %d, b = %d\n", a, b);printf("a + b = %d\n", add(a, b));printf("a - b = %d\n", subtract(a, b));printf("a * b = %d\n", multiply(a, b));printf("a / b = %f\n", divide(a, b));return 0;
}

五、test2文件夹 ​​​​​​​ 

  • sort.cpp
#include "sort.h"
#include <iostream>
using namespace std;
int  main()
{int a[10] = {8,1,9,7,2,4,5,6,10,3};insert(a,10);cout<<"插入排序结果:";print(a,10);select(a, 10);cout << "选择排序结果: ";print1(a, 10);
}

六、添加CMakeLists.txt

1.在calc文件夹中添加CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(calc)# 搜索源文件
aux_source_directory(./ SRC)
include_directories(${HEADPATH}) # 头文件路径 HEADPATHset(LIBRARY_OUTPUT_PATH ${LIBPATH}) # 库生成的路径 LIBPATH
add_library(${CALCLIB} STATIC ${SRC}) # 生成静态库

2. 在test1文件夹中添加CMakeLists.txt 

cmake_minimum_required(VERSION 3.10)
project(test1)aux_source_directory(./ SRC)
include_directories(${HEADPATH})set(EXECUTABLE_OUTPUT_PATH ${EXECPATH})# 包含静态库路径
link_directories(${LIBPATH})
# 链接静态库, calc为静态库的名字
link_libraries(${CALCLIB})add_executable(${APPNAME1} ${SRC})

3.在sort文件夹中添加CMakeLists.txt 

cmake_minimum_required(VERSION 3.10)
project(sort)# 搜索源文件
aux_source_directory(./ SRC)
include_directories(${HEADPATH}) # 头文件路径 HEADPATHset(LIBRARY_OUTPUT_PATH ${LIBPATH}) # 库生成的路径 LIBPATH
add_library(${SORTLIB} STATIC  ${SRC}) # 生成静态库

4. 在test2文件夹中添加CMakeLists.txt 

cmake_minimum_required(VERSION 3.10)
project(test2)aux_source_directory(./ SRC)
include_directories(${HEADPATH})set(EXECUTABLE_OUTPUT_PATH ${EXECPATH})# 包含静态库路径
link_directories(${LIBPATH})
# 链接静态库, calc为静态库的名字
link_libraries(${SORTLIB})add_executable(${APPNAME2} ${SRC}) 

5. 在该项目的根目录中添加CMakeLists.txt 

cmake_minimum_required(VERSION 3.10)
project(test)
# 定义变量# 库生成的路径
set(LIBPATH ${PROJECT_SOURCE_DIR}/lib)# 可执行程序的存储目录(测试程序生成的路径)
set(EXECPATH ${PROJECT_SOURCE_DIR}/bin)# 头文件路径
set(HEADPATH ${PROJECT_SOURCE_DIR}/include)# 库文件的名字
set(CALCLIB calc)
set(SORTLIB sort)# 可执行程序的名字
set(APPNAME1 app1)
set(APPNAME2 app2)# 给当前节点添加子目录
add_subdirectory(calc)
add_subdirectory(sort)
add_subdirectory(test1)
add_subdirectory(test2)

执行命令:
1.mkdir build
2.cd build
3.cmake ..
4.make
5.cd ../bin
6. ./app1
7. ./app2执行结果:
heheda@linux:~/Linux/multi-v1$ mkdir build
heheda@linux:~/Linux/multi-v1$ cd build
heheda@linux:~/Linux/multi-v1/build$ cmake ..
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/heheda/Linux/multi-v1/build
heheda@linux:~/Linux/multi-v1/build$ make
Scanning dependencies of target calc
[  8%] Building CXX object calc/CMakeFiles/calc.dir/add.cpp.o
[ 16%] Building CXX object calc/CMakeFiles/calc.dir/div.cpp.o
[ 25%] Building CXX object calc/CMakeFiles/calc.dir/mult.cpp.o
[ 33%] Building CXX object calc/CMakeFiles/calc.dir/sub.cpp.o
[ 41%] Linking CXX static library ../../lib/libcalc.a
[ 41%] Built target calc
Scanning dependencies of target sort
[ 50%] Building CXX object sort/CMakeFiles/sort.dir/insert.cpp.o
[ 58%] Building CXX object sort/CMakeFiles/sort.dir/select.cpp.o
[ 66%] Linking CXX static library ../../lib/libsort.a
[ 66%] Built target sort
Scanning dependencies of target app1
[ 75%] Building CXX object test1/CMakeFiles/app1.dir/calc.cpp.o
[ 83%] Linking CXX executable ../../bin/app1
[ 83%] Built target app1
Scanning dependencies of target app2
[ 91%] Building CXX object test2/CMakeFiles/app2.dir/sort.cpp.o
[100%] Linking CXX executable ../../bin/app2
[100%] Built target app2
heheda@linux:~/Linux/multi-v1/build$ cd ../bin
heheda@linux:~/Linux/multi-v1/bin$ ./app1
a = 20, b = 12
a + b = 32
a - b = 8
a * b = 240
a / b = 1.666667
heheda@linux:~/Linux/multi-v1/bin$ ./app2
插入排序结果:1  2  3  4  5  6  7  8  9  10  
选择排序结果: 1  2  3  4  5  6  7  8  9  10  
heheda@linux:~/Linux/multi-v1/bin$ 

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

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

相关文章

基于面向对象编程,C++实现单链表

链表&#xff1a;在内存空间中是非连续存储 组成&#xff1a;链表是由一个个节点组成的&#xff0c;每个节点都包含两个元素&#xff1a;数据和指针 节点头文件&#xff1a; 建立一个ListNode.h头文件 #pragma once class ListNode { public:int value;ListNode* next;Lis…

当浏览器输入url的时候会发生什么?

说在前面 当我们在浏览器中输入URL并按下回车时&#xff0c;背后发生了一系列神秘的操作。本文将带您深入了解&#xff0c;从URL解析到页面渲染&#xff0c;揭秘浏览器输入URL的完整流程。 具体步骤 当浏览器输入URL时&#xff0c;一般经过以下细节步骤&#xff1a; 1、引言 …

利用Qt输出XML文件

使用Qt输出xml文件 void PixelConversionLibrary::generateXML() {QFile file("D:/TEST.xml");//创建xml文件if (!file.open(QIODevice::WriteOnly | QIODevice::Text))//以只写方式&#xff0c;文本模式打开文件{qDebug() << "generateXML:Failed to op…

语义分割miou指标计算详解

文章目录 1. 语义分割的评价指标2. 混淆矩阵计算2.1 np.bincount的使用2.2 混淆矩阵计算 3. 语义分割指标计算3.1 IOU计算方式1(推荐)方式2 3.2 Precision 计算3.3 总体的Accuracy计算3.4 Recall 计算3.5 MIOU计算 参考 MIoU全称为Mean Intersection over Union&#xff0c;平均…

Docker五部曲之三:镜像构建

文章目录 前言Docker构建架构构建指令构建上下文本地目录Git存储库压缩文件纯文本文件.dockerignore文件 Dockerfile解析器指令环境变量命令执行格式exec格式shell格式 FROMRUNCMDLABELEXPOSEENVADDCOPYENTRYPOINTVOLUMEUSERWORKDIRARGONBUILDSHELL 多级构建 前言 本文均翻译自…

对快速排序思想的进一步理解,分而治之,欧几里得算法(常用求最大公约数的方法)

自己找到的最优的快排的代码 快速排序 思想 分而治之使用欧几里得算法&#xff08;辗转相除法&#xff09;来求解一个应用题 假设有一块地&#xff0c;现在用这个同样大小的正方形来铺满&#xff0c;求所可用的最大的正方形地砖的面积 这两个方法放在一起是因为这个欧几里得要…

Linux环境之Ubuntu安装Docker流程

今天分享Linux环境之Ubuntu安装docker流程&#xff0c;Docker 是目前非常流行的容器&#xff0c;对其基本掌握很有必要。下面我们通过阿里云镜像的方式安装&#xff1a; 本来今天准备用清华大学镜像安装呢&#xff0c;好像有点问题&#xff0c;于是改成阿里云安装了。清华安装…

抓交通肇事犯(python)

问题描述&#xff1a; 一辆卡车违反交通规则&#xff0c;撞人后逃跑。现场有三人目击该事件&#xff0c;但都没有记住车号&#xff0c;只记下了车号的一些特征。甲说&#xff1a;牌照的前两位数字是相同的&#xff1b;乙说&#xff1a;牌照的后两位数字是相同的&#xff0c;但…

GVM垃圾收集器

Serial收集器&#xff08;新生代&#xff09; Serial&#xff08;串行&#xff09;收集器是最基本、历史最悠久的垃圾收集器&#xff0c;采用“标记-复制”算法负责新生代的垃圾收集。它是Hotspot虚拟机运行在客户端模式下的默认新生代收集器。 它是一个单线程收集器。它会使用…

软件测试学到这个程度,面试轻松拿下20K

很多人认为&#xff0c;软件测试是一个简单的职位&#xff0c;职业生涯走向也不会太好&#xff0c;但是随着时间的推移&#xff0c;软件测试行业的变化&#xff0c;人们开始对软件测试行业的认知有了新的高度&#xff0c;越来越多的人开始关注这个行业&#xff0c;开始重视这个…

v-if控制div内容显示,克隆这个div但是v-if没有效果

问题描述&#xff1a; 我的子页面打印的时候通过isPdf来隐藏“选择参加人员”按钮。 我子页面有个el-dialog&#xff0c;el-dialog里面有个大的div它的id为app-pre-meet-add&#xff0c;在子页面我通过isPdf来显示我想要的内容。现在我在父页面先通过this.$refs.child.control…

分布式缓存

分布式缓存 缓存雪崩 缓存雪崩我们可以简单的理解为&#xff1a;由于原有缓存失效&#xff0c;新缓存未到期间所有原本应该访问缓存的请求都去查询数据库了&#xff0c;而对数据库 CPU 和内存造成巨大压力&#xff0c;严重的会造成数据库宕机。从而形成一系列连锁反应&#xf…

C++与Typescript的区别

目录 一、C类模板和函数模板 1.类模板 2.函数模板 二&#xff0c;Typescript 的泛型声明 1.泛型函数 2.泛型类 为什么C和Typescript语言中主张模板和泛型 一、C类模板和函数模板 在C中&#xff0c;类模板和函数模板允许你为多种数据类型编写通用的代码。这就像每个人都有…

山西电力市场日前价格预测【2024-01-14】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-14&#xff09;山西电力市场全天平均日前电价为415.13元/MWh。其中&#xff0c;最高日前电价为851.84元/MWh&#xff0c;预计出现在18:15。最低日前电价为198.87元/MWh&#xff0c;预计…

使用 C++/WinRT 创作 API

如果 API 位于 Windows 命名空间中 这是你使用 Windows 运行时 API 最常见的情况。 对于元数据中定义的 Windows 命名空间中的每个类型&#xff0c;C/WinRT 都定义了 C 友好等效项&#xff08;称为投影类型 &#xff09;。 投影类型具有与 Windows 类型相同的完全限定名称&…

【LabVIEW FPGA入门】使用CompactRIO进行SPI和I2C通信

NI提供了 SPI and I2C Driver API&#xff1a;下载SPI and I2C Driver API - NI 该API使用FPGA数字I / O线与SPI或I2C设备进行通信。 选择数字硬件时&#xff0c;要考虑三个选项&#xff1a; NI Single-Board RIO硬件可同时使用SPI和I2C驱动程序。NI 9401 C系列模块与SPI驱动程…

大型语言模型,用最少的数学和行话进行解释

本文来自于《Large language models, explained with a minimum of math and jargon》&#xff0c;不嵌入任何笔者的个人理解&#xff0c;只是对原文的总结与记录。 文章作者是Tim Lee和Sean Trott&#xff0c;Tim Lee是一位拥有计算机科学硕士学位的记者&#xff0c;Sean Trot…

【二十】【动态规划】879. 盈利计划、377. 组合总和 Ⅳ、96. 不同的二叉搜索树 ,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

关于jupyter突然打不开的问题

好久没有用python了&#xff0c;我的电脑环境是安装过anaconda和pycharm&#xff0c;但是有些简单的东西就希望在jupyter中测试一下&#xff0c;但是最近发现jupyter打不开了。 具体是&#xff1a; 在这里打开jupyter是可以的&#xff0c;但是在命令行就不行&#xff0c;表现为…

计算机毕业设计 | SpringBoot+vue的家庭理财 财务管理系统(附源码)

1&#xff0c;绪论 1.1 项目背景 网络的发展已经过去了七十多年&#xff0c;网络技术的发展&#xff0c;将会影响到人类的方方面面&#xff0c;网络的出现让各行各业都得到了极大的发展&#xff0c;为整个社会带来了巨大的生机。 现在许多的产业都与因特网息息相关&#xff…