嵌套的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.cpp

5 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}) # 头文件路径 HEADPATH

set(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}) # 头文件路径 HEADPATH

set(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$ 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring之AOP源码(一)

文章目录 一、动态代理1. 概念2. Cglib动态代理的使用3. JDK动态代理的使用 二、SpringAOP1. 简介2. Spring AOP使用 一、动态代理 1. 概念 动态代理&#xff08;Dynamic Proxy&#xff09;是一种在运行时动态生成代理对象的技术。它是一种设计模式&#xff0c;用于在不修改原…

Web实战丨基于django+html+css+js的电子商务网站

文章目录 写在前面实验目标需求分析实验内容安装依赖库1.登陆界面2.注册界面3.电子商城界面4.其他界面 运行结果写在后面 写在前面 本期内容&#xff1a;基于DjangoHTMLCSSJS的电子商务网站 实验环境&#xff1a; vscode或pycharmpython(3.11.4)django 代码下载地址&#x…

Web自动化测试,一定得掌握的 8 个核心知识点

使用 cypress 进行端对端测试&#xff0c;和其他的一些框架有一个显著不同的地方&#xff0c;它使用 javascript 作为编程语言。传统主流的 selenium 框架是支持多语言的&#xff0c;大多数 QA 会的python 和 java 语言都可以编写 selenium 代码&#xff0c;遇到需要编写 js 代…

距离美赛还有20天,不要忘了阅读往年获奖论文(附04-23年美赛获奖论文)

之前发了很多数模相关的知识&#xff0c;受到了一些人的关注&#xff0c;也有很多人私下问我&#xff0c;距离美赛还有20几天了&#xff0c;还来不来得及。 对此我想说&#xff0c; 来不来得及重要吗&#xff1f; 你名都报了&#xff0c;钱也交了&#xff0c;还是笔不小的钱…

猫狗大战(猫狗识别)

1.问题简介 1.1问题描述 在这个问题中&#xff0c;你将面临一个经典的机器学习分类挑战——猫狗大战。你的任务是建立一个分类模型&#xff0c;能够准确地区分图像中是猫还是狗。 1.2预期解决方案 你的目标是通过训练一个机器学习模型&#xff0c;使其在给定一张图像时能够准…

【模块系列】STM32BMP280

前言 最进想练习下I2C的应用&#xff0c;手上好有BMP280也没用过&#xff0c;就看着机翻手册和原版手册&#xff0c;开始嘎嘎写库函数了。库的命名应该还1是比较规范了吧&#xff0c;就是手册对于最终值的计算方式很迷糊&#xff0c;所以现在也不能保证有可靠性啊&#xff0c;大…

关于运维·关于数据库面试题

目录 一、数据库类型 二、数据库引擎 三、mysql数据库类型 四、mysql的约束添加 五、主从复制原理 六、主从方式有几种 七、mysql主从数据不一致的原因 八、mysql的优化 九、什么是事务的特征 十、数据库读写分离的好处 十一、怎样优化sql语句 十二、mysql的同步方…

基于MAP算法的Turbo译码 -- 公式推导

到此为止&#xff0c;讲完了turbo译码器的子译码器基于MAP算法的译码过程。但在实际使用中&#xff0c;很少直接使用MAP算法进行译码。而是使用改进的LOG-MAP和MAX-LOG-MAP算法进行译码&#xff0c;因此译码的整体流程&#xff0c;包括外信息的计算以及先验信息的获取等。都在后…

openai自定义API操作 API (openai.custom)

OpenAI 提供了一个自定义 API&#xff0c;允许开发者通过编程方式与 OpenAI 的 AI 模型进行交互。使用这个 API&#xff0c;你可以执行各种任务&#xff0c;例如文本生成、推理和翻译等。 以下是使用 OpenAI 自定义 API 的基本步骤&#xff1a; 创建 API 密钥&#xff1a;首先…

谷粒商城-商品服务-品牌管理-阿里云云存储+JSR303数字校验+统一异常处理

阿里云云存储OSS 分布式系统上传文件 分布式系统上传文件 单体应用上传&#xff1a;上传文件到服务器&#xff0c;想获取文件时再向服务器发请求获取文件。 分布式系统上传&#xff1a; 因为有多台服务器&#xff0c;为防止负载均衡导致获取文件时没找到对应的服务器&#xf…

数字信号处理教程学习笔记1-第2章时域中的离散信号和系统

信号处理的任务示意方框图 模拟信号和数字信号分别是啥样的,有啥区别

MySQL数据库设计原则

0.简单的处理逻辑 一.MySQL完整性约束 主键约束 primary key 自增键约束 auto_increment 唯一键约束 unique 非空约束 not null 默认值约束 default 外键约束 foreign key 下面是一个sql语句创建一个表,可以看出来了使用了哪几个约束吗? create table user( id int…

vue前端开发自学,借助KeepAlive标签保持组件的存活

vue前端开发自学,借助KeepAlive标签保持组件的存活&#xff01;如果不想让组件在切换的时候&#xff0c;被默认操作&#xff08;卸载掉了&#xff09;。他们需要使用这个这个表情哦。 下面给大家看看代码情况。 <template><h3>ComA</h3><p>{{ messag…

Arduino开发实例-AS608光学指纹传感器驱动

AS608光学指纹传感器驱动 文章目录 AS608光学指纹传感器驱动1、AS608光学指纹传感器介绍2、硬件准备及接线3、代码实现3.1 指纹录入3.2 指纹匹配验证1、AS608光学指纹传感器介绍 AS608 光学指纹传感器可用于扫描指纹,它也可以通过串行通信将处理后的数据发送到微控制器。 所有…

鸿蒙(HarmonyOS)应用开发指南

1. 概述 1.1 简介 鸿蒙&#xff08;即 HarmonyOS &#xff0c;开发代号 Ark&#xff0c;正式名称为华为终端鸿蒙智能设备操作系统软件&#xff09;是华为公司自 2012 年以来开发的一款可支持鸿蒙原生应用和兼容 AOSP 应用的分布式操作系统。该系统利用“分布式”技术将手机、电…

好用的便签有哪些?windows便签工具在哪打开?

每当我8点准时上班&#xff0c;在等待电脑开机的过程&#xff0c;我都会习惯性地思考整理今天要晚上的任务&#xff0c;列出所要完成的待办事项。随着每一项任务的清晰呈现&#xff0c;我的心情也逐渐明朗起来。当然了&#xff0c;这个时候&#xff0c;我迫切需要一款好用的便签…

【LeetCode】142. 环形链表 II(中等)——代码随想录算法训练营Day04

题目链接&#xff1a;142. 环形链表 II 题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了…

springcloud stream消息驱动

简介 Spring Cloud Stream是一个用于构建基于事件驱动的微服务应用程序的框架&#xff0c;其核心目标是简化开发过程&#xff0c;降低消息通信的复杂性&#xff0c;从而使开发人员能够专注于编写业务逻辑。Spring Cloud Stream通过提供Binder抽象&#xff0c;将应用程序与消息…

使用 Docker 进行 Go 应用程序引导指南

为在 Docker 中部署的 Go 应用程序做准备 在使用 Go 开发 Web 应用程序时&#xff0c;无论是用于 HTTP 还是其他类型的服务&#xff0c;部署到不同的阶段或环境&#xff08;本地开发、生产环境等&#xff09;都是一个常见的考虑因素。在本文中&#xff0c;我们将探讨在 Docker …

利用低代码技术,企业怎样开拓数字化转型新路径?

近年来&#xff0c;随着技术的发展和市场竞争的加剧&#xff0c;企业数字化转型已成为一种趋势。许多企业已经完成了线上协作办公的初步转型&#xff0c;这主要得益于像钉钉、企微等发展完善的平台&#xff0c;只需将员工全部拉入这些平台&#xff0c;就能实现线上协作办公。 然…