现在有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. RHEL7/CentOS7 安装Zabbix

    1.添加 Zabbix 软件仓库 rpm -ivh http://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.n ...

  2. Linux/Ubuntu 16.04 安装编辑器 Sublime Text 3

    在ubuntu 16.04 系统上使用Sublime Text 3 编辑文本还是不错的, 先到官网下载安装包,链接:http://www.sublimetext.com/3 ,下载对应的版本,64位或 ...

  3. 关于Http

    摘自:菜鸟教程 HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(www)服务器传输超文本到本地浏览器的传送协议. HTTP ...

  4. 解释型语言VS编译型语言

    前言 计算机不能直接理解除机器语言以外的语言,所以只有把程序员编写的程序翻译成机器语言,计算机才能够执行程序. 将其他语言翻译成机器语言的工具,被称之为:编译器. 编译器的翻译方式有两种:编译和解释. ...

  5. CENTOS重新安装JDK

    centos 删除默认安装的JDK 重新安装JDK 1.删除JDK 通过xshell工具成功连接安装好的虚拟机之后可通过    rpm -qa | grep java  或 rpm -qa | gre ...

  6. express+sequelize 做后台

    第一部分:安装express 第一步:执行 npm install -g express-generator note:必须安装这个,不然创建express项目的时候会提示express命令没有找到 ...

  7. 使用git 遇见的错误使用到的命令

    查看远端地址  git remote -v 需要重新添加地址  git remote set-url origin xxx 远程新的地址 git remote add origin_new 设置用户名 ...

  8. .NET Core开源快速开发框架Colder发布 (NET Core2.1+AdminLTE版)

    引言 上星期发布的.NET452+AdminLTE版框架得到了大家的大力支持,目前GitHub已获近100星,鄙人十分高兴能够帮助大家.其中有不少关心.NET Core的支持情况,因为未来的.NET平 ...

  9. Photoshop调出田园照片唯美手绘油画效果

    先看看效果图 原片分析:妹子脸上的光不够通透,有些灰暗,整体色调不够分明. 后期思路:色彩往油画风格调整,让画面色彩更加油润.丰富. 基础调整 (1)曝光根据照片的实际情况进行调整 (2)增加阴影部分 ...

  10. python_while

    while 格式 while 条件 : pass 使用 while True : print("精忠报国") print("粉红的回忆") print(&quo ...