现在有3个模块:main、service、base,main依赖service的service.h、service依赖base的base.h,怎么写CMakeList.txt避免main直接耦合base

- main

- service

- base

base模块

- base.h

- base.cpp

- CMakeLists.txt

 //base/base.h

 #ifndef BASE_H
#define BASE_H void hello_base(); #endif //BASE_H
 //base/base.cpp

 #include "base.h"
#include <stdio.h> void hello_base()
{
printf("hello base\n");
}
 #base/CMakeLists.txt

cmake_minimum_required(VERSION 3.12) set(HEADER_LIST base.h)
set(SOURCE_LIST base.cpp) file(COPY ${HEADER_LIST} DESTINATION ".") add_library(base ${HEADER_LIST} ${SOURCE_LIST})
  • file(COPY ${HEADER_LIST} DESTINATION  ".")

主要是为了把头文件做为一个编译输出,方便下面的使用

service 模块

- service.h

- service.cpp

- CMakeLists.txt

 //service/service.h

 #ifndef SERVICE_H
#define SERVICE_H
#include "base.h" //用来测试main模块是否能找到base.h,正常尽量在源文件内包含头文件 void hello_service(); #endif //SERVICE_H
 //service/service.cpp

 #include "service.h"
#include <stdio.h> void hello_service()
{
printf("hello service\n");
hello_base();
}
 #service/CMakeLists.txt

cmake_minimum_required(VERSION 3.12) set(SOURCE_LIST service.cpp)
set(HEADER_LIST service.h) add_subdirectory(${CMAKE_SOURCE_DIR}/../base base.output)
include_directories(base.output) file(COPY ${HEADER_LIST} DESTINATION ".") add_library(service ${HEADER_LIST} ${SOURCE_LIST}) add_dependencies(service base)
target_link_libraries(service base)
  • add_subdirectory(${CMAKE_SOURCE_DIR}/../base base.output)

将base模块的输出base.h、libbase.a放到当前目录的base.output下

main 模块

- main.cpp

- CMakeLists.txt

 //main/main.cpp

 #include "service.h"

 int main(int argc, const char* argv[])
{
hello_service();
return ;
}
 #main/CMakeLists.txt

cmake_minimum_required(VERSION 3.12) project(main)
set(SOURCE_LIST main.cpp) add_subdirectory(${CMAKE_SOURCE_DIR}/../service service.output) file(GLOB_RECURSE INC_PATH *.h)
foreach(DIR ${INC_PATH})
STRING(REGEX REPLACE "/[a-z,A-Z,0-9,_,.]+$" "" dirName ${DIR})
include_directories(${dirName})
endforeach() add_executable(main ${SOURCE_LIST} ${HEADER_LIST}) add_dependencies(main service)
target_link_libraries(main service)
  • add_subdirectory(${CMAKE_SOURCE_DIR}/../service service.output)

将service的输出放到service.output,而base的输出自动到了service.output/base.output下

  • foreach(DIR ${INC_PATH}) .....

遍历所有包含头文件的目录(output目录)添加到main的依赖里,暂时没有想到更好的方法

成为第一个赞同者

cmake 递归依赖的更多相关文章

  1. saltstack对递归依赖条件(死循环依赖)的处理

    本文将对saltstack中状态文件中require条件产生死循环的情形进行简单的测试和分析 测试思路: 写一个包含递归依赖条件的状态文件,进行测试:      A依赖于B      B依赖于C    ...

  2. VS 2013编译64位版本QT 4.8.6及使用cmake为依赖QT生成VS项目时Could NOT find Qt4

    对于一些已经解决的问题,本博客不再讨论.只将本人遇到的问题做简单的说明. 一.VS 2013编译64位版本QT 4.8.6 QT项目官网中,对于QT4,其只提供了windows X86的版本,并且支持 ...

  3. cmake 使用

    1.cmake 显示编译命令: 在顶层CMakeLists.txt里设置 set(CMAKE_VERBOSE_MAKEFILE ON) 或者  cmake .        再           m ...

  4. 根据配置文件加载js依赖模块(JavaScript面试题)

    面试题目 根据下面的配置文件 module=[ {'name':'jquery','src':'/js/lib/jquery-1.8.3.js'}, {'name':'swfobject','src' ...

  5. VS2013配置Caffe卷积神经网络工具(64位Windows 7)——准备依赖库

    VS2013配置Caffe卷积神经网络工具(64位Windows 7)--准备依赖库 2014年4月的时候自己在公司就将Caffe移植到Windows系统了,今年自己换了台电脑,想在家里也随便跑跑,本 ...

  6. (译)ABP之依赖注入

    原文地址:https://aspnetboilerplate.com/Pages/Documents/Dependency-Injection 什么是依赖注入 传统方式的问题 解决方案 构造函数注入 ...

  7. 【maven】maven查看项目依赖并解决依赖冲突的问题

    一.问题 项目开发过程中,经常会遇到jar冲突,然后maven根据自己的规则进行冲突解决,导致项目在运行的过程中报错. 1.maven自动解决依赖冲突的规则是什么? 2.如何查看当前项目的maven的 ...

  8. ABP官方文档翻译 2.1 依赖注入

    依赖注入 什么是依赖注入 传统方式的问题 解决方案 构造函数注入模式 属性注入模式 依赖注入框架 ABP依赖注入基础设施 注册依赖注入 传统注册 帮助接口 自定义/直接注册 使用IocManager ...

  9. CMake最好的学习资料

    本文为转载,阅读不友好,请先查看原文:https://blog.gmem.cc/cmake-study-note 收下为原文内容================> 基础知识 CMake简介 CM ...

随机推荐

  1. 二进制安装 mariadb

    默认路径安装MySQL,Mariadb 非常简单,解压,配置权限,修改配置文件基本即可使用:自定义安装稍微有点麻烦,需要修改的地方稍微多点: 下面详细介绍自定义目录,二进制安装mariadb, 使用传 ...

  2. GlusterFS群集存储项目

    最小化安装的centos7.5 内存大于1GB 关闭selinux,防火墙端口放行(port:24007,111)(测试建议关闭firewalld) 一.环境部署 所有软件包离线安装,原因是yum安装 ...

  3. SqlServer如何给表添加新的字段以及字段注释

    语法: USE 数据库名ALTER TABLE 表名 ADD 字段名  类型  默认值  是否为空;EXEC sp_addextendedproperty N'MS_Description', N'注 ...

  4. DVWA-命令执行学习笔记

    DVWA-命令执行 原理: web服务器没有对用户提交的数据进行严格的过滤,造成调用操作系统的命令或者在操作系统恶意拼接拼接命令,以达到攻击者的目的. 1.将DVWA的级别设置为low 1.2查看源代 ...

  5. 3Openwrt自定义CGI实现 前后端交互

    https://www.cnblogs.com/163yun/p/9834993.html 安装uhttpd. 在编译openwrt前,输入make memuconfig,查找Network -> ...

  6. 04 前端篇(JQuery)

    jquery: http://www.cnblogs.com/yuanchenqi/articles/5663118.html 优点:简洁.兼容 jquery 对象:   jQuery 或  $ 基本 ...

  7. CentOS7.x安装cobbler无人值守安装系统

    CentOS7.x cobbler无人值守安装 cobbler介绍 自打若干年前 Red Hat,推出了 Kickstart,不再需要刻了光盘一台一台地安装 Linux,只要搞定 PXE.DHCP.T ...

  8. vue 绑定样式的几种方式

    vue 绑定样式 对象语法 1.v-bind:class设置一个对象,动态切换class <div :class="{'active':isActive}">xxx&l ...

  9. modelsim10.1a安装破解说明

    安装包网盘下载链接:https://pan.baidu.com/s/1X9kUUXMCoikyjCQ_HKdD5g 提取码:3lfd 1.下载文件解压找到"modelsim-win32-10 ...

  10. js 前端常用排序算法总结

    (冒泡排序.快排顺序.选择排序.插入排序.归并排序) 下面是前端比较常用的五个算法demo: 冒泡算法:比较两个相邻的数值,if第一个>第二个,交换他们的位置元素项向上移动至正确的顺序. fun ...