cmake 递归依赖

现在有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

 1 #base/CMakeLists.txt
 2 
 3 cmake_minimum_required(VERSION 3.12)
 4 
 5 set(HEADER_LIST base.h)
 6 set(SRC_LIST base.cpp)
 7 
 8 file(COPY ${HEADER_LIST} DESTINATION  ".")
 9 
10 add_library(base ${HEADER_LIST} ${SRC_LIST})
  •  file(COPY ${HEADER_LIST} DESTINATION  ".")

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

service 模块

- service.h

- service.cpp

- CMakeLists.txt

 1 #service/CMakeLists.txt
 2 
 3 cmake_minimum_required(VERSION 3.12)
 4 
 5 set(SRC_LIST service.cpp)
 6 set(HEADER_LIST service.h)
 7 
 8 add_subdirectory(${CMAKE_SOURCE_DIR}/../base base.output)
 9 include_directories(base.output)
10 
11 file(COPY ${HEADER_LIST} DESTINATION  ".")
12 
13 add_library(service ${HEADER_LIST} ${SRC_LIST})
14 
15 add_dependencies(service base)
16 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

 1 #main/CMakeLists.txt
 2 
 3 cmake_minimum_required(VERSION 3.12)
 4 
 5 project(main)
 6 set(SOURCE_LIST main.cpp)
 7 
 8 add_subdirectory(${CMAKE_SOURCE_DIR}/../service service.output)
 9 
10 file(GLOB_RECURSE INC_PATH cmake_install.cmake)
11 foreach(DIR ${INC_PATH})
12     STRING(REPLACE "/cmake_install.cmake" "" dirName ${DIR})
13     include_directories(${dirName})
14 endforeach()
15 
16 add_executable(main ${SOURCE_LIST} ${HEADER_LIST})
17 
18 add_dependencies(main service)
19 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的依赖里,暂时没有想到更好的方法

猜你喜欢

转载自www.cnblogs.com/tianrks/p/10655556.html