CMake进行复杂工程管理与目录结构设计
- 项目目录结构如下:
- SEED:总项目
- SEED_BP: 项目公共依赖库
- SEED_SERVER:业务后台服务
- SEEDOTHER:其他后台服务
- SEEDOUT:项目输出目录已经依赖目录
2.目录结构图
项目文件结构图
3.CMakeList.txt编写
3.1.工程总配置
# ./SEED/CMakeLists.txt,工程总配置文件
# 最低版本要求,必须
cmake_minimum_required(VERSION 3.0)
# 工程名称,这里用SEED这个名字
project(SEED)
# 添加include目录,本例公共头文件在SEED/SEEDBP/include目录下,所以直接取${PROJECT_SOURCE_DIR}/SEEDBP/include
set(SEED_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/SEEDBP/include)
include_directories(SEED_INCLUDE_DIR)
# 添加链接库查找目录,注:库查找序按照参数顺序从左向右查
set(SEED_LIB_DIR1 ${PROJECT_SOURCE_DIR}/SEEDOUT/lib)
set(SEED_LIB_DIR2 ${PROJECT_SOURCE_DIR}/SEEDOUT/lib2)
link_directories(${SEED_LIB_DIR} ${SEED_LIB_DIR2} /usr/local/libs /usr/lib)
# 设置生成的库文件目录,项目的成库目录和依赖库lib目录相同(/SEED/SEEDOUT/lib)
set(LIBRARY_OUTPUT_PATH ${SEED_LIB_DIR1})
# 设置可执行文件目录,项目的成库目录和依赖库bin目录相同(/SEED/SEEDOUT/bin)
set(SEED_BIN_DIR ${PROJECT_SOURCE_DIR}/SEEDOUT/bin)
set(EXECUTABLE_OUTPUT_PATH ${SEED_BIN_DIR})
# 添加子目录(每个子目录下都必须有自已的CMakeLists.txt文件)
set(SEED_BP ${PROJECT_SOURCE_DIR}/SEEDBP)
add_subdirectory(SEED_BP)
set(SEED_SERVER ${PROJECT_SOURCE_DIR}/SEEDSERVER)
add_subdirectory(SEED_SERVER)
set(SEED_OTHER ${PROJECT_SOURCE_DIR}/SEEDOTHER)
add_subdirectory(SEED_OTHER)
3.2SEEDBP工程配置
# ./SEED/SEEDBP/CMakeLists.txt,SEEDBP(基础库)子工程配置文件
# 工程名称,这里用SEED这个名字
project(SEEDBP)
#设置子项目路径
set(SEED_BP_DIR ${PROJECT_SOURCE_DIR}/SEEDBP)
# 添加子目录(每个子目录下都必须有自已的CMakeLists.txt文件)
set(SEED_BP ${SEED_BP_DIR}/SEEDCURL)
add_subdirectory(SEED_BP)
set(SEED_SERVER ${SEED_BP_DIR}/SEEDETCD)
add_subdirectory(SEED_SERVER)
3.2.1 SEEDETCD 和 SEEDCURL工程配置
# ./SEED/SEEDBP/SEEDETCD/CMakeLists.txt SEEDETCD(基础库)具体工程配置文件
# 工程名称,这里用SEED这个名字
project(SEEDETCD)
#设置子项目内部头文件路径
set(SEED_ETCD_DIR ${PROJECT_SOURCE_DIR}/SEEDBP/SEEDETCD)
include_directories(SEED_ETCD_DIR)
#设置C++标准 判断是否是G++
if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_STANDARD 14)
endif(CMAKE_COMPILER_IS_GNUCXX)
set(SOURCE_FILES seed_etcd.cpp)
add_library(SEED_BP_ETCD ${SOURCE_FILES})
# ./SEED/SEEDBP/SEEDCURL/CMakeLists.txt SEEDETCD(基础库)具体工程配置文件
# 工程名称,这里用SEED这个名字
project(SEEDCURL)
#设置子项目内部头文件路径
set(SEED_CURL_DIR ${PROJECT_SOURCE_DIR}/SEEDBP/SEEDCURL)
include_directories(SEED_CURL_DIR)
#设置C++标准 判断是否是G++
if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_STANDARD 14)
endif(CMAKE_COMPILER_IS_GNUCXX)
set(SOURCE_FILES seed_curl.cpp)
add_library(SEED_BP_CURL ${SOURCE_FILES})
4.1. SEEDSERVER子工程配置
# ./SEED/SEEDSERVER/CMakeLists.txt, SEEDSERVER(生成项目)子工程配置文件
# 工程名称,这里用SEEDSERVER这个名字
project(SEEDSERVER)
#设置子项目路径
set(SEED_SERVER_DIR ${PROJECT_SOURCE_DIR}/SEEDSERVER)
# 添加子目录(每个子目录下都必须有自已的CMakeLists.txt文件)
set(SEED_FACE ${SEED_SERVER_DIR}/SEEDFACE)
add_subdirectory(SEED_FACE)
set(SEED_MANAGER ${SEED_SERVER_DIR}/SEEDMANAGER)
add_subdirectory(SEED_MANAGER)
4.1.1 SEEDFACE 和 SEEDMANAGER具体工程配置
# ./SEED/SEEDSERVER/SEEDFACE/CMakeLists.txt SEEDFACE(人脸服务)具体工程配置文件
# 最低版本要求,必须
# 工程名称,这里用SEEDFACE这个名字
project(SEEDFACE)
#设置子项目内部头文件路径
set(SEED_FACE_DIR ${PROJECT_SOURCE_DIR}/SEEDSERVER/SEEDFACE)
include_directories(SEED_FACE_DIR)
#设置C++标准 判断是否是G++
if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_STANDARD 14)
endif(CMAKE_COMPILER_IS_GNUCXX)
#添加fpic选项
set(CMAKE_CXX_FLAGS“$ {CMAKE_CXX_FLAGS} -fPIC”)
set(SOURCE_FILES seed_face.cpp)
add_executable(SEEDFACE ${SOURCE_FILES})
target_link_libraries(SEEDFACE seed_curl seed_etcd)
# ./SEED/SEEDSERVER/SEEDMANAGER/CMakeLists.txt SEEDMANAGER(人脸管理服务)具体工程配置文件
# 工程名称,这里用SEEDFACE这个名字
project(SEEDMANAGER)
#设置子项目内部头文件路径
set(SEED_MANAGER_DIR ${PROJECT_SOURCE_DIR}/SEEDSERVER/SEEDMANAGER)
include_directories(SEED_MANAGER_DIR)
#设置C++标准 判断是否是G++
if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_STANDARD 14)
endif(CMAKE_COMPILER_IS_GNUCXX)
#添加fpic选项
set(CMAKE_CXX_FLAGS“$ {CMAKE_CXX_FLAGS} -fPIC”)
set(SOURCE_FILES seed_manager.cpp)
add_executable(SEEDMANAGER ${SOURCE_FILES})
target_link_libraries(SEEDMANAGER seed_curl seed_etcd))
5. SEEDOTHER 配置,此处省略,CMake配置与SEEDSERVER配置一样,只需稍作修改即可。
6.SEEDOUT目录说明
6.1 SEEDOUT 的bin 目录是用来存储项目生成的可执行文件,好处是不会把源文件目录污染。
6.2SEEDOUT 的lib 和lib1 目录是用来存储生成库和依赖库的地方,目的同上