CMake系列(八) CMake 多级目录

2023-05-16

CMake系列(八) CMake 多级目录

文章目录

  • CMake系列(八) CMake 多级目录
    • 目录结构
      • 结构说明
      • 调用关系
    • 源文件
    • CMakeLists.txt
      • 最外层CMakeLists
      • main的CMakeLists
      • app的CMakeLists
      • app1的CMakeLists
      • app2的CMakeLists
      • app3的CMakeLists
      • public的CMakeLists
      • public1的CMakeLists
      • public2的CMakeLists
    • 编译


目录结构

├── app
│   ├── app1
│   │   ├── app1.c
│   │   ├── app1.h
│   │   └── CMakeLists.txt
│   ├── app2
│   │   ├── app2.c
│   │   ├── app2.h
│   │   └── CMakeLists.txt
│   ├── app3
│   │   ├── app3.c
│   │   ├── app3.h
│   │   └── CMakeLists.txt
│   └── CMakeLists.txt
├── CMakeLists.txt
├── include
│   └── Static.h
├── lib
│   └── libhello_library.a
├── main
│   ├── CMakeLists.txt
│   └── main.c
└── public
	├── CMakeLists.txt
	├── public1
   	│   ├── CMakeLists.txt
	│   ├── public1.c
	│   └── public1.h
	└── public2
    	├── CMakeLists.txt
    	├── public2.c
    	└── public2.h

结构说明


app目录存放应用层代码
public中存放公共代码
main中存放主函数代码
lib中存放三方静态库(本节使用CMake系列(三) CMake编译出静态库和动态库并使用产生的静态库)
include存放三方库需要用到的头文件

调用关系

		├──app1.c
		│	
		├──app2.c
		│	└──public2.c
		│	
		├──app3.c
		│	└──libstatic_library.a
main.c──│	
		├──public1.c
		│	
		├──public2.c
		│
		└──libstatic_library.a

源文件

main.c

#include "app1.h"
#include "app2.h"
#include "app3.h"
#include "public1.h"
#include "public2.h"
#include "Static.h"

int main(int argc, char *argv[])
{
	printf("main: cmake\r\n");
	App1_print();
	App2_print();
	App3_print();
	Public1_print();
	Public2_print();
	Static_print();
	printf("main: end\r\n");
    return 0;
}

app1.c

#include "app1.h"

void App1_print(void)
{
    printf("app1: cmake\r\n");
    printf("app1: end\r\n");
}

app2.c

#include "app2.h"
#include "public2.h"

void App2_print(void)
{
    printf("app2: cmake\r\n");
    Public2_print();
    printf("app2: end\r\n");
}

app3.c

#include "app3.h"
#include "Static.h"

void App3_print(void)
{
    printf("app3: cmake\r\n");
    Static_print();
    printf("app3: end\r\n");
}

public1.c

#include "public1.h"

void Public1_print(void)
{
    printf("public1: cmake\r\n");
    printf("public1: end\r\n");
}

public2.c

#include "public2.h"
void Public2_print(void)
{
    printf("public2: cmake\r\n");
    printf("public2: end\r\n");
}

CMakeLists.txt

最外层CMakeLists

cmake_minimum_required(VERSION 3.5)

project(subprojects)

# Add sub directories
# 定义子目录src,用以递归的调用src中的MakeLists.txt
add_subdirectory(public)
add_subdirectory(app)
add_subdirectory(main)

最后三行,使用add_subdirectory调用子目录的MakeLists.txt

main的CMakeLists

project(main)

# Create the executable
add_executable(${PROJECT_NAME} main.c)

target_include_directories( ${PROJECT_NAME}
    PUBLIC ${subprojects_SOURCE_DIR}/include
)
#link_directories( ${subprojects_SOURCE_DIR}/lib )

# Link the static library from subproject1 using it's alias sub::lib1
# Link the header only library from subproject2 using it's alias sub::lib2
# This will cause the include directories for that target to be added to this project
target_link_libraries(${PROJECT_NAME}
    lib::app1
    lib::app2
    lib::app3
    lib::public1
    lib::public2
    ${subprojects_SOURCE_DIR}/lib/libstatic_library.a
)

最后一行使用target_link_libraries 连接其他文件。

app的CMakeLists

#定义子目录
add_subdirectory(app1)
add_subdirectory(app2)
add_subdirectory(app3)
)

app1的CMakeLists

# Set the project name
project (app1)
# Add a library with the above sources
add_library(${PROJECT_NAME} app1.c)
add_library(lib::app1 ALIAS ${PROJECT_NAME})

target_include_directories( ${PROJECT_NAME}
    PUBLIC ${PROJECT_SOURCE_DIR}
)

app2的CMakeLists

# Set the project name
project (app2)
# Add a library with the above sources
add_library(${PROJECT_NAME} app2.c)
add_library(lib::app2 ALIAS ${PROJECT_NAME})

target_include_directories( ${PROJECT_NAME}
    PUBLIC ${PROJECT_SOURCE_DIR}
)

target_link_libraries(${PROJECT_NAME}
    lib::public2
)

app3的CMakeLists

# Set the project name
project (app3)
# Add a library with the above sources
add_library(${PROJECT_NAME} app3.c)
add_library(lib::app3 ALIAS ${PROJECT_NAME})

target_include_directories( ${PROJECT_NAME}
    PUBLIC ${PROJECT_SOURCE_DIR}
    	   ${subprojects_SOURCE_DIR}/include
)

target_link_libraries(${PROJECT_NAME}
    ${subprojects_SOURCE_DIR}/lib/libstatic_library.a
)

public的CMakeLists

#定义子目录
add_subdirectory(public1)
add_subdirectory(public2)
)

public1的CMakeLists

# Set the project name
project (public1)

# Add a library with the above sources
add_library(${PROJECT_NAME} public1.c)
add_library(lib::public1 ALIAS ${PROJECT_NAME})

target_include_directories( ${PROJECT_NAME}
    PUBLIC ${PROJECT_SOURCE_DIR}
)

public2的CMakeLists

# Set the project name
project (public2)

# Add a library with the above sources
add_library(${PROJECT_NAME} public2.c)
add_library(lib::public2 ALIAS ${PROJECT_NAME})

target_include_directories( ${PROJECT_NAME}
    PUBLIC ${PROJECT_SOURCE_DIR}
)

编译

	$  mkdir build
	$  cd build/
	$  cmake .. 
	$  make
	$  cd main
	./main
	main: cmake
	app1: cmake
	app1: end
	app2: cmake
	public2: cmake
	public2: end
	app2: end
	app3: cmake
	static hello: cmake
	app3: end
	public1: cmake
	public1: end
	public2: cmake
	public2: end
	static hello: cmake
	main: end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake系列(八) CMake 多级目录 的相关文章

随机推荐

  • 我在STM32单片机上跑神经网络算法

    01 前言 为什么可以在STM32上面跑神经网络 xff1f 简而言之就是使用STM32CubeMX中的X Cube AI扩展包将当前比较热门的AI框架进行C代码的转化 xff0c 以支持在嵌入式设备上使用 目前使用X Cube AI需要在
  • slambook2+ch7+orb_self 源码的一点小问题

    slambook2 43 ch7 43 orb self 源码的一点小问题 43 解读 源码详细解读小错误调试 xff0c 有的真的属实自己菜运行结果 源码详细解读 下面是一些个人的见解内联代码片 span class token comm
  • 运行相机与vins_Fusion

    安装相机的SDK git clone https github com slightech MYNT EYE D SDK git cd MYNT EYE D SDK make init make all 这里由于没有添加依赖 xff0c O
  • 无刷无霍尔BLCD电机控制

    声明 xff1a 本文出自百度文库无刷无霍尔电机控制 xff0c 因为该文为繁体 xff0c 看起来特别别扭 xff0c 特此翻译 文库网址 xff1a https wenku baidu com view b99217dca0116c17
  • stl的中常用几个容器的介绍与特点。

    lt 1 gt vector容器 vector容器是一个动态数组的结构 xff0c 在内存中有一个指针指向一块连续的内存 类似数组结构一样 它的特点支持随机访问数据 xff0c 因为其在内存中的单元是连续 如此之外 xff0c 还可以vec
  • 关闭优化选项

    这里没有调用拷贝构造函数 xff0c 按照C 43 43 机制 xff0c 应该是会调用的 想起来 xff0c 以前最初写拷贝构造函数的时候也是跟预想的调用不一致 记得编译器会自动优化掉临时对象的 比如 在一个函数中 return list
  • WIFI学习一(socket介绍)

    一 什么是socket socket译为 插座 xff0c 在计算机通信领域 xff0c socket被翻译为 套接字 xff0c 它是计算机之间进行通信的一种约定或一种方式 通过这种方式 xff0c 一台计算机可以接受其他计算机的数据 x
  • 两台电脑实现串口通信

    本文主要介绍串口传输文件的练习 将两台笔记本电脑 xff0c 借助 usb转rs232 模块和杜邦线 xff0c 建立起串口连接 然后用串口助手等工具软件 xff08 带文件传输功能 xff09 将一台笔记本上的一个大文件 xff08 图片
  • VScode前进和后退按钮,非快捷键

    在网上找了半天 xff0c 不喜欢用快捷键 xff0c 喜欢鼠标点击 xff0c 费了好长时间发现这个插件 Back amp Forth xff0c 安装后可以在右上角出现前进和后退按钮 xff0c 如下图
  • Nonce验证

    验证可能会涉及 span class token keyword def span span class token function getNonce span span class token punctuation span span
  • DJI飞行器 精准降落功能测试

    概述 xff1a 该功能仅在自动返航至起飞点 Auto RTL 时生效 xff0c 飞行器降落环境需要足够的照明和没有障碍物的区域 使用该功能后 xff0c 飞行器将使用底部的两个视觉传感器记录起飞时的地形纹理信息 xff0c 并根据记录的
  • 带学生参加电赛,5个国一,2个国二!15个省奖!

    大家好 xff0c 我是张巧龙 xff0c 转眼21年的各省电赛就结束了 xff0c 今年的电赛确实让人难忘 xff0c 不管是题目还是比赛形式 xff0c 亦或是比赛时间一拖再拖 国赛结果也在前段时间公示了 xff0c 参与人数再次增长
  • 【JAVA基础篇】内部类

    定义在一个类内部的类称为内部类 内部类访问权限可以是public protected default或private xff0c 可以声明为abstract供其他内部类或外部类继承 xff0c 可以声明为static final xff0c
  • CURL 是什么

    cURL是一个利用URL语法在命令行下工作的文件传输工具 xff0c 1997年首次发行 它支持文件上传和下载 xff0c 所以是综合传输工具 xff0c 但按传统 xff0c 习惯称cURL为下载工具 cURL还包含了用于程序开发的lib
  • STM32F103C8T6 gps串口数据处理

    基于stm32f10x系列单片机demo程序修改 配置串口 void USART1 Config void GPIO InitTypeDef GPIO InitStructure USART InitTypeDef USART InitSt
  • RS-485总线布线规则及方法

    摘要 xff1a 本文阐述了RS 485双向串行总线的特点 RS 485总线在实际应用中的布线规则 拓扑结构和匹配电阻的连接方法 可供有关技术人员在RS 485总线设计和施工时做参考 关键词 xff1a RS 485 总线 规则 方法 前言
  • jetson nano 基础设置

    关闭图像界面 span class token function sudo span systemctl set default multi user target 开启图像界面 span class token function sudo
  • Android JNI Java/C++互相调用

    一 xff0c Java 调用 C 1 xff0c 首先我们创建一个文件名字叫做 xff0c JNI 其实你不创建也行 看自己 public class JNI 加载本地C语言文件库 库名字为你写的C语言文件名 static System
  • STM32串口空闲中断,中断标志位无法清除

    本节目录 今天想使用STM32的串口空闲中断作接收 xff0c 调了1个小时 xff0c 发现串口空闲中断无法被清除 xff0c 网上搜索半天发现 xff0c 能用清除的库函数清除该中断 我又回头看了一下手册 果真如此 xff0c 问题已解
  • CMake系列(八) CMake 多级目录

    CMake系列 xff08 八 xff09 CMake 多级目录 文章目录 CMake系列 xff08 八 xff09 CMake 多级目录目录结构结构说明调用关系 源文件CMakeLists txt最外层CMakeListsmain的CM