博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cmake 自动add_subdirectory
阅读量:7024 次
发布时间:2019-06-28

本文共 3521 字,大约阅读时间需要 11 分钟。

hot3.png

cmake 自动add_subdirectory

开始学习c++已经有一段时间了,练习用的代码很零碎,需要很多个main,一直使用cmake管理,但是每新建一个学习子项,都需要去修改cmakelists,很麻烦。

刚好开了个新的学习项目,所以写了个基本不用改的cmakelists

文件路径如下:

├── CMakeLists.txt

├── common
│ ├── boost_log_template_main
│ │ ├── CMakeLists.txt
│ │ └── main.cpp
│ ├── common_include
│ │ ├── boost_log_init.cpp
│ │ ├── boost_log_init.h
│ │ ├── common_configure.h.in
│ │ ├── common_funcs.cpp
│ │ ├── common_funcs.h
│ │ └── common_includes.h
│ └── properties
│ ├── boost_log_settings.ini
│ └── log4cplus_root.properties
├── README.md
└── stl_study
├── changeable_var
│ ├── CMakeLists.txt
│ └── main.cpp
├── stl_common_tools
│ ├── CMakeLists.txt
│ ├── main.cpp
│ ├── std_chrono_study.cpp
│ └── std_chrono_study.h
└── stl_container
├── CMakeLists.txt
└── main.cpp

每次要新建子项目是只需要拷贝./common/boost_log_template_main到./stl_study下,然后修改:1、文件夹名;2、子项目名

这样就方便多了

贴cmakelist:
根目录的cmakelist不用再改,会循环添加stl_study下的文件夹为子项目:

cmake_minimum_required(VERSION 3.12)

project(CPP_STL_studys)

set(CMAKE_CXX_STANDARD 14)

### 设置编译flags

message("cmake env flags ${CMAKE_BUILD_TYPE}")

set(CMAKE_CXX_FLAGS "-fPIC ${CMAKE_CXX_FLAGS}")

if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")

    message("build type debug!")
    set(CMAKE_CXX_FLAGS "-Wall -O0  -g -ggdb ${CMAKE_CXX_FLAGS}")
elseif ("${CMAKE_BUILD_TYPE}}" STREQUAL "Release")
    message("build type release!")
    set(CAKE_CXX_FLAGS "-O3 -Wall ${CMAKE_CXX_FLAGS}")
else ()
    message("unknow type:${CMAKE_BUILD_TYPE}")
endif ()
message("cmake cxx build flags:${CMAKE_CXX_FLAGS}")

#设置版本号

set(VERSION_MAJOR 1.1)
set(VERSION_MINOR 0)
#配置版本号的映射文件,方便代码中使用
configure_file(
        "${PROJECT_SOURCE_DIR}/common/common_include/common_configure.h.in"
        "${PROJECT_BINARY_DIR}/convent/common_configure.h"
)
#通用头文件
include_directories(${PROJECT_SOURCE_DIR}/common/common_include)
include_directories(${PROJECT_BINARY_DIR}/convent)

#### add execuable from sub dir

set(auto_analisis_dir ${PROJECT_SOURCE_DIR}/stl_study/)

execute_process(
        COMMAND ls ${auto_analisis_dir}
        OUTPUT_VARIABLE dirs)

message("find files : \n${dirs}")

string(REPLACE "\n" ";" RPLACE_LIST ${dirs})

foreach (f ${RPLACE_LIST})

    message("add :${f}")
    add_subdirectory(${auto_analisis_dir}${f})
endforeach (f ${RPLACE_LIST})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
子项目中的cmakelist:

#子项目名 替换template_name为子项目名

set(build_temp template_name)

message("\n###############################\nstart cmake ${build_temp}")

aux_source_directory(./ ${build_temp}cpps)
include_directories(./)
message("${build_temp}cpps find cpps : ${${build_temp}cpps}")
add_executable(${build_temp} ${${build_temp}cpps}

        #以下为common_funcs 的cpp文件

        ${PROJECT_SOURCE_DIR}/common/common_include/common_funcs.cpp
        ${PROJECT_SOURCE_DIR}/common/common_include/boost_log_init.cpp

        #IDE不识别aux到的cpp文件,不进行符号表处理,只能手动变一遍

        #如果发布,删除以下内容

        )

#拷贝配置文件
add_custom_command(
        TARGET ${build_temp}
        COMMAND echo copying files:
        COMMAND cp -v ${PROJECT_SOURCE_DIR}/common/properties/boost_log_settings.ini `pwd`/
        COMMAND echo copying files is finished.
)
add_definitions(-DBOOST_LOG_DYN_LINK)

target_link_libraries(${build_temp} gtest pthread boost_log boost_log_setup boost_thread boost_system)

message("${build_temp} cmake finish\n###############################\n")

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
每个子项目都有自己的依赖,这样管理方便一些

会自动拷贝配置文件到执行目录

--------------------- 
作者:puzzzzzzle 
来源:CSDN 
原文:https://blog.csdn.net/qq_33213364/article/details/87946940 
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://my.oschina.net/u/4000302/blog/3037345

你可能感兴趣的文章
929. 独特的电子邮件地址
查看>>
19. Spring Boot Shiro 权限管理
查看>>
【C语言】14-返回指针的函数与指向函数的指针
查看>>
uoj#119. 【UR #8】决战圆锥曲线(线段树+复杂度分析)
查看>>
docker 13 dockerfile的保留字指令
查看>>
(转)开放window是服务器端口——以8080为例
查看>>
C# 通过IEnumberable接口和IEnumerator接口实现泛型和非泛型自定义集合类型foreach功能...
查看>>
微信小程序初识
查看>>
Ubuntu中打开RAR文件
查看>>
数字转换大写人民币的delphi实现
查看>>
开源的asp.net工作流程引擎。 http://ccflow.org
查看>>
日期和时间字符串格式化
查看>>
POJ2774:Long Long Message——题解
查看>>
javascript作用域与预解析
查看>>
C# 中的拓展方法,以StringBuilder加上IndexOf方法举例
查看>>
第41件事 创新设计的4种方法
查看>>
用半监督算法做文本分类
查看>>
【2802】SDUTOJ (并查集模板水题2)
查看>>
看书不挑出版社的都是山炮——评60家国内出版社
查看>>
关于消除超长的case列表的一个思路
查看>>