cmake构建多目录项目

2023-11-16

#1) 项目工程文件目录结构

#2) 源码
##2.1) hello/include/hello.h

#ifndef HELLOWORLD_HELLO_H
#define HELLOWORLD_HELLO_H

extern void hello(void);

#endif //HELLOWORLD_HELLO_H

##2.2) hello/src/hello.c

#include "hello.h"
#include <stdio.h>

void hello()
{
    printf("hello.\n");
}

##2.3) hello/CMakeLists.txt

include_directories(./include)

set(DIR_SRCS ./src/hello.c)

add_library(hello SHARED ${DIR_SRCS})

##2.4) world/include/world.h

#ifndef HELLOWORLD_WORLD_H
#define HELLOWORLD_WORLD_H

extern void world(void);

#endif //HELLOWORLD_WORLD_H

##2.5) world/src/world.c

#include "world.h"
#include <stdio.h>

void world()
{
    printf("world.\n");
}

##2.6) world/CMakeLists.txt

include_directories(./include)

set(DIR_SRCS ./src/world.c)

add_library(world SHARED ${DIR_SRCS})

##2.7) app/main.c

#include "hello.h"
#include "world.h"

int main()
{
    hello();
    world();

    return 0;
}

##2.8) CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(HelloWorld)

set(CMAKE_C_STANDARD 99)

include_directories(hello/include world/include)

set(DIR_SRCS ./app/main.c)

add_subdirectory(hello)
add_subdirectory(world)

add_executable(HelloWorld ${DIR_SRCS})

target_link_libraries(HelloWorld hello world)

#3) 配置
由于顶层目录下CMakeLists.txt包含子目录下的CMakeLists.txt文件,所以只需在顶层目录下运行“cmake .”命令即可。
但“cmake .”执行完毕后,会在工程顶层目录下生成大量cmake输出的临时文件。

我们可以在顶层目录下单独创建一个空目录,专门由于存储cmake配置、make编译输出的文件。使用命令如下:

# cd cmake-build-debug
# cmake ..

# ls
CMakeCache.txt  CMakeFiles  cmake_install.cmake  hello  Makefile  world

# ls hello/
CMakeFiles  cmake_install.cmake  Makefile

# ls world/
CMakeFiles  cmake_install.cmake  Makefile

此时可以看到cmake-build-debug存放很多cmake输出文件,包括工程顶层目录对应的Makefile文件,还有工程子目录下对应的Makefile文件。


#4) 编译
在上面通过cmake输出整个工程编译的Makefile,只需在工程顶层目录下使用命令

make -C cmake-build-debug 

执行:

./cmake-build-debug/HelloWorld

#5) 总结

通过上面使用cmake去配置整个项目编译规则,明显感觉比直接去写Makefile要简单很多,而且从工程配置到编译的过程中,整个工程源码目录下不会有其它文件产生,这种做法感觉很优雅,所有的cmake输出文件(包含Makefile),make输出文件(包括*.o/*.a/*.so)都在cmake-build-debug目录下,如果下次想从新配置、编译,只需删除此目录下所有文件和子目录。

最后附上源码:https://download.csdn.net/download/agq358/36493261

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmake构建多目录项目 的相关文章

随机推荐

  • GeoServer发布地图服务并在OpenLayers中显示:shp的WMS服务和GeoTIFF的WTMS服务

    GeoServer发布的地图服务结构如下 必须创建一个工作区 该工作区下可以存放多组无关数据 也就是说 工作区的作用就类似于一个文件夹 仅仅用于分类 在工作区下添加数据存储 数据存储即一组相关数据 通常 一个地区的地图可能是单个文件构成 也
  • vim进阶

    首先晒一张我的vim截图 基本IDE有的功能都能实现了 虽然在日常工作里还是IDE用的多 但是作为一个开发者 少不了折腾的心 vim 作为与emacs齐名的编辑器 无需更多溢美之词 由于学习曲线陡峭 但是学会之人 无不表示其方便 vim操作
  • Docker 安装 MySQL、Redis、Nginx

    222 1 Portainer 安装 docker可视化 2 Docker 安装MySQL 3 Docker安装Redis 4 Docker安装 Nginx 1 Portainer 安装 docker可视化 docker run d p 8
  • C++多线程(三)事件

    事件 解决两个线程通信问题 要注意死锁 g hEvent CreateEvent NULL FALSE FALSE NULL WaitForSingleObject g hEvent INFINITE ResetEvent g hEvent
  • ubuntu18-opencv3.4.6移植到aarch64

    一 前提条件 需先安装好arm64相关的交叉编译器 安装好cmake gui 下载并解压opencv3 4 6 下载ippicv 2019 lnx intel64 general 20180723 tgz 二 配置cmake 进入openc
  • Unity初学者学习路线与建议

    Unity初学者学习路线与建议 目录 Unity初学者学习路线与建议 一 前言 二 我的学习建议 三 学习要点 一 前言 Holle大家好 先自我介绍一下 我现在大二 专业是数字媒体技术 方向是游戏制作 学的是Unity 和我同专业的另一个
  • Ubuntu 16.04安装MinGW32

    直接使用命令 sudo apt get install mingw32 会报错 Unable to locate package mingw32 解决办法如下 sudo gedit etc apt sources list 在sources
  • ModBus-RTU详解

    Modbus 一个工业上常用的通讯协议 一种通讯约定 Modbus协议包括RTU ASCII TCP 其中MODBUS RTU最常用 比较简单 在单片机上很容易实现 虽然RTU比较简单 但是看协议资料 手册说得太专业了 起初很多内容都很难理
  • Mysql中字符串正确的连接方法

    虽然SQL server和My sql的语句基本都一致 但是仍然存在一些小区别 就如字符串的连接来说 SQL server中的字符串连接是使用 来连接 不带引号sql server是做加法运算 而my sql中无论是带引号和不带引号 它都将
  • 无缓存交换

    请编写一个函数 函数内不使用任何临时变量 直接交换两个数的值 给定一个int数组AB 其第零个元素和第一个元素为待交换的值 请返回交换后的数组 测试样例 1 2 返回 2 1 思路 使用异或 public int exchangeAB in
  • python3生成中文词云图

    usr bin python3 coding utf 8 coding utf 8 导入wordcloud模块 from wordcloud import WordCloud 中文分词库 pip install jieba import j
  • BMP to AVI 及其压缩的实现

    1 设计方案的产生 这个设计方案是物光院嵌入式系统试验室的基于CDMA技术的无线视频传输监控系统的设计的一部分 我简要说明此系统的原理 系统单片机部分主要模块由CDMA DSP与ARM处理器 FLASH ROM组成 此单片机用来获取监控所在
  • python+selenium 处理需要确定证书对话框

    场景如下 使用selenium 处理网页时 碰到了跳出证书的情况 如下图 所见 当使用get请求网页的时候 由于网页一直处于跳出状态 无法使用页面内容来进行操作 只能卡死在这一步 考虑到只需要在当前页面用鼠标点击或者键盘回车即可 但是sel
  • tomcat自带连接池dbcp配置以及优化说明

    转自 http www totcms com html 201602 29 20160229114145 htm 一个网站每天大概有20万的访问量 使用的tomcat自带dbcp连接池 一般网站访问很好 速度也很快 但是过一段时间后 总是报
  • VMware上pfsense开源防火墙的下载、安装、简单配置

    文章目录 1 pfsense概述 1 1 官方描述 1 2 个人描述 2 pfsense下载 2 1 官网下载 3 pfsense安装 3 1 官网手册 3 2 安装步骤 4 pfsense配置 4 1 默认账号密码 4 2 初始化配置 4
  • PyTorch学习笔记(三)PyTorch回归问题——分类问题

    PyTorch学习笔记 三 PyTorch回归问题 分类问题 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 一 pandas是什么 示例 pandas 是基于NumPy 的一种工具 该工具是为了
  • 性能测试的基本流程

    1 性能测试需求分析 项目经理 业务 架构专家 产品经理 高级性能测试工程师 开发经理 2 性能测试计划 高级性能测试工程师 项目经理 架构师 产品经理 3 性能测试准备 性能测试工程师 外部支持 网络工程师 系统管理员 测试服务器和被测试
  • 记录——企业课Python-科学计算(只学了Numpy、pandas和matplotlib.pyplot中的一些基础)

    一学期一次的企业课 大好的周末在机房度过 三个周日一个周六 感觉听的讲起来还不如自己看CSDN 顺带吐槽一下这个老师的评分 自己敲了一天整天最后得分82 同学复制粘贴过去87 更有甚者32学时课程结束 复制过来的代码连环境都没有都无法运行居
  • 微云存储空间多大_qq微云内存多大

    QQ微云容量最大多少 根据QQ微云官方的说法 可以达到100G 微云网盘怎么扩容 扩容方法可分为2种 一是登录QQ微云iPad版等获得额外的8G空间 二是参加每天签到活动获得额外的容量 下面就由学习啦小编为大家整理的相关信息 供大家参考 一
  • cmake构建多目录项目

    1 项目工程文件目录结构 2 源码 2 1 hello include hello h ifndef HELLOWORLD HELLO H define HELLOWORLD HELLO H extern void hello void e