嵌套的CMake

news2024/9/23 17:23:56
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$ 

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

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

相关文章

(三)CMake为什么几乎一统C++跨平台构建?

先看几个简单的例子再回头来看这个问题 回想一下当我们用windows写C第一个Hello World!的步骤&#xff0c;先用VS IDE 创建一个控制台的工程&#xff0c;IDE 会自动生成一个 cpp 文件&#xff0c;里面有一句 输出"Hello World!" 代码&#xff0c;这个时候按下F5 就可…

如何生成文本: 通过 Transformers 用不同的解码方法生成文本

如何生成文本: 通过 Transformers 用不同的解码方法生成文本 假设 $p0.92$&#xff0c;Top-p 采样对单词概率进行降序排列并累加&#xff0c;然后选择概率和首次超过 $p92%$ 的单词集作为采样池&#xff0c;定义为 $V_{\text{top-p}}$。在 $t1$ 时 $V_{\text{top-p}}$ 有 9 个…

GULP 案例 4:如何计算热力学性质(热容、熵、焓、自由能等)?

---------------------------------------------------------------------- 物体的热力学性质是指物质处于平衡状态下压力 P、体积 V、温度 T、组成以及其他的热力学函数之间的变化规律。一般将材料的压力 P、体积 V、温度 T、内能 U、焓 H、熵 S 等统称为物体热力学性质。 热…

Android Lint的使用

代码检查方式一&#xff1a; Android Studio使用Lint进行代码检查 找到Analyze目录下的Inspect Code检查代码选项点击然后弹出下面这个框框&#xff0c;在这个列表选项中我们可以选择Inspect Code的范围&#xff0c;点击OK 待分析完毕后&#xff0c;我们可以在Inspection栏目中…

mysql数据库被黑恢复—应用层面delete删除---惜分飞

客户的mysql被人从应用层面攻击,并且删除了一些数据,导致业务无法正常使用,通过底层分析binlog确认类似恢复操作 确认这类的业务破坏是通过delete操作实现的,客户那边不太幸,客户找了多人进行恢复,现场严重破坏,老库被删除,并且还原了历史的备份文件(非故障第一现场),通过底层…

iOS Universal Links(通用链接)详细教程

一&#xff1a;Universal Links是用来做什么的&#xff1f; iOS9.0推出的用于应用之间跳转的一种机&#xff0c; 通过一个https的链接启动app。如果手机有安装需要启动的app&#xff0c;可实现无缝跳转。如果没有安装&#xff0c;会打开网页。 实现场景&#xff1a;微信链接无…

分布式系统的三字真经CAP

文章目录 前言C&#xff08;Consistency 数据一致性&#xff09;A&#xff08;Availability 服务可用性&#xff09;P&#xff08;Partition Tolerance 分区容错性&#xff09;CAP理论最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;我一起探索一下分布式系统的三字真经C…

贝叶斯分类器(公式推导+举例应用)

文章目录 引言贝叶斯决策论先验概率和后验概率极大似然估计朴素贝叶斯分类器朴素贝叶斯分类器的优点与缺点优点缺点 总结实验分析 引言 在机器学习的世界中&#xff0c;有一类强大而受欢迎的算法——贝叶斯分类器&#xff0c;它倚仗着贝叶斯定理和朴素的独立性假设&#xff0c…

程序员副业之AI文库项目(超详细完整全流程)

引言 大家好&#xff0c;我是小黑&#xff0c;今天给大家介绍一个特别简单的项目&#xff0c;用AI辅助咱们来编写各种word&#xff0c;PPT等资料上传到百度文库、原创力、道客巴巴、csdn等平台赚取被动的睡后收益。 但要注意&#xff0c;只是辅助&#xff0c;即便是用AI辅助&…

SpringBoot项目里用MultipartFile作为入参获取到的file为什么null

前言&#xff1a; 最近在项目中用到了Excel模板导入功能&#xff0c;但是在测试阶段用Postman测试时&#xff0c;通过Post请求&#xff0c;传到后端的File一直为null。其中前端传参和请求都没问题&#xff0c;后端的接参也没问题&#xff0c;问题出在过滤器的复用上。 问题场…

Matlab字符识别实验

Matlab 字符识别OCR实验 图像来源于屏幕截图&#xff0c;要求黑底白字。数据来源是任意二进制文件&#xff0c;内容以16进制打印输出&#xff0c;0-9a-f’字符被16个可打印字符替代&#xff0c;这些替代字符经过挑选&#xff0c;使其相对容易被识别。 第一步进行线分割和字符…

【QT】标准对话框

目录 1 概述 2 QFileDialog对话框 1.选择打开一个文件 2.选择打开多个文件 3&#xff0e;选择已有目录 4&#xff0e;选择保存文件名 3 QColorDialog对话框 4 QFontDialog对话框 5 QInputDialog标准输入对话框 1.输入文字 2&#xff0e;输入整数 3&#xff0e;输入…

Himawari-8 数据下载【利用FTP】

1 波段介绍 2 注册 数据下载之前&#xff0c;必须进行注册 JAXA Himawari Monitor | Registration 注册后&#xff0c;在邮箱里点击同意 邮箱会给出FTP的账号信息 3 下载FTP软件 点击进行新站点的新建 设置刚才邮箱里的主机、用户和密码 选择远程站点&#xff0c;选择自己…

【JaveWeb教程】(25) JDBC、数据库连接池、Lombok 详细代码示例讲解(最全面)

目录 2. JDBC介绍(了解)2.1 介绍2.2 代码2.3 问题分析2.4 技术对比 3. 数据库连接池3.1 介绍3.2 产品 4. lombok4.1 介绍4.2 使用 2. JDBC介绍(了解) 2.1 介绍 通过Mybatis的快速入门&#xff0c;我们明白了&#xff0c;通过Mybatis可以很方便的进行数据库的访问操作。但是大…

wpf使用Popup封装数据筛选框--粉丝专栏

类似于DevExpress控件的功能 这是DevExpress的winform筛选样式&#xff0c;如下&#xff1a; 这是DevExpress的wpf筛选样式&#xff0c;如下&#xff1a; 这是Excel的筛选样式&#xff0c;如下&#xff1a; 先看效果 本案例使用wpf原生控件封装&#xff0c;功能基本上都满足…

Python Web开发库之vcrpy 使用详解

概要 在现代Web开发中&#xff0c;HTTP请求是不可避免的一部分。然而&#xff0c;通过网络发送HTTP请求可能会导致一些问题&#xff0c;如慢速响应、网络不稳定和API限制。为了解决这些问题&#xff0c;Python社区开发了一些工具和库&#xff0c;其中之一就是vcrpy。vcrpy是一…

RabbitMQ 的基本概念

一 MQ 的基本概念 1 MQ概述 MQ全称 Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。消息队列就是所谓的存放消息的队列。 消息队列解决的不是存放消息的队列的⽬的&#xff0c;解决的是通信问…

C++I/O流——(2)预定义格式的输入/输出(第二节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

基于EEMD-SpEn(样本熵)联合小波阈值去噪

代码原理 以样本熵为阈值的EEMD联合小波阈值去噪方法是一种结合了经验模态分解&#xff08;EEMD&#xff09;、样本熵和小波阈值去噪的信号处理方法&#xff0c;用于去除信号中的噪声。 下面是具体的步骤&#xff1a; 1. 经验模态分解&#xff08;EEMD&#xff09;&#xff…

uniapp 开发小程序的时候使用自定义 tabbar 时出现切换页面闪烁的情况

问题&#xff1a;在使用自定义组件的时候可以看到页面切换明显的闪烁, 这种体验是很不好的, 当然最好的方式就是使用原生导航栏, 不要搞花里胡哨的东西。 来看下体验不好的效果 优化调整 先说思路&#xff0c;就是仍然设置原生 tabbar, 在应用启动的时候主动隐藏原生 tabba…