现在有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. python一直放弃到双数的day10

    今天接着来说那个新的大知识点,函数,函数中是可以传递一个数值的,这个数值简称为参数,对于参数,他可以是任意个数和任意类型(数据类型).参数的其中一种有位置传参,函数中的参数有几个,那么就要传入几个,传 ...

  2. MySql 触发器的新增、修改、删除的创建

    MySql 触发器与SQL server 触发器不同: SQL Server   使用 inserted.deleted 代表被触发的数据. MySQL NEW代表触发后的新数据行,Old代表当前触发 ...

  3. Qt class

    Help on class Qt in module PyQt5.QtCore: class Qt(sip.simplewrapper) |  Method resolution order: |   ...

  4. 在后台业务管理系统中使用Autofac实现微信接口的处理

    在后台业务管理系统中使用Autofac实现微信接口的处理,我们只需要把相关使用到的DLL放到BIN目录里面即可,通过IOC控制反转方式实现对接口的调用.在实现在业务系统里面,我们本身程序可能已经依赖了 ...

  5. 爬取5K分辨率超清唯美壁纸

    目录 爬取5K分辨率超清唯美壁纸 简介 编写思路 使用教程 演示图片 完整源代码 @ 爬取5K分辨率超清唯美壁纸 简介 壁纸的选择其实很大程度上能看出电脑主人的内心世界,有的人喜欢风景,有的人喜欢星空 ...

  6. python上下文管理

    一.python上下文介绍: python中的上下文,指的就是代码所执行的环境状态,或者运行的场景 python上下文管理器规定了某个对象的使用范围,当进入或者离开了使用范围,会有相应的操作,多用于资 ...

  7. TypeError: argument 1 must be an integer, not _subprocess_handle/OSError: [WinError 87]

    Error Msg: Traceback (most recent call last): File "c:\python27\lib\site-packages\celery\worker ...

  8. JVM进程占用CPU过高问题排查

    上午收到报警,某台机器上的CPU负载过高,通过逐步的排查,解决了问题,下面记录一下整个排查的过程. 首先,登录上对应的机器,通过top命令找到占用CPU过高的进程ID,也就是PID,为29126, 然 ...

  9. PHP二维数组去重(指定键名)

    本例对二维数组中某个指定键名进行去重,发现网上大多使用array_unique或是foreach遍历等方式去重,效果不佳且较为繁琐. 本文以二维数组去重为引,介绍array_column函数的三种用法 ...

  10. 财务CLOUD成本核算

    1.关账  仓库账关账 2.应收应付是否已审核 生成财务应收应付 3.存货账关账 4.1采购存货核算 4.2零成本维护 4.3成本中心设置 4.4成本项目设置 4.5费用项目设置 4.6成本项目匹配方 ...