1.采用 out-of-source 外部构建多个目录多个文件

这里的文件存储方式如下:

其中build是构建目录,即构建的结果和中间产物都在该目录下

include是包含目录

src是子函数的目录或是依赖文件的目录

main.cpp主函数

从上图的右边可以发现src里存在add.cpp和一个对应的cmakelists.txt文件,同时根目录下也存在一个cmakelists.txt文件

main.cpp#include<iostream>
#include"include/add.h"
using namespace std;
int main()
{cout<<" hello world"<<endl;int a = 3;int b = 5;cout<<" 3 + 5 = "<<add(a,b)<<endl;return 0;
}#########################################
add.cpp#include"add.h"int add(int& a, int& b)
{return a+b;
}

上面的代码就是两个源文件的代码,很简单,主函数调用另个一文件的子函数add完成运算和输出,下面看看如何使用cmake进行构建

根目录下的CMakeLists.txt

# 多个目录多个源文件
cmake_minimum_required(VERSION 2.8)project(test1)
# 遍历当前目录的所有文件并使用DIR_SRCS保存,也可以通过SET(SRC_LIST main.c)进行指定
aux_source_directory(. DIR_SRCS)# 添加生成可执行文件的保存目录,不会保存中间产物,如果不指定该目录则和中间产物保存在一起
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin )
# 添加头文件
include_directories(${PROJECT_SOURCE_DIR}/include)
# 这里将子目录条件到工程,并指定编译的输出产物,默认输出产物保存到build/src文件夹下,
# 如果不指定可行文件保存路径同样也会保存到该路径下
add_subdirectory(src)# 上面定义了将src子目录加入工程,并指定编译输出(包含编译中间结果)路径为
# bin目录。如果不进行 bin目录的指定,那么编译结果(包括中间结果)都将存放在
# build/src 目录(这个目录跟原有的src目录对应),指定 bin 目录后,相当于在编译时
# 将src重命名为bin,所有的中间结果和目标二进制都将存放在bin目录。# 指定生成目标
add_executable(test1 main.cpp)# 添加链接库
# 把子目录集src的编译成的库文件链接到这里
target_link_libraries(test1 add)message(STATUS  ${PROJECT_SOURCE_DIR} "------完成编译和链接生成可执行文件-----")

上面的作用都进行了详细的解释,这里需要强调的是几个命令:

set指令的语法是:
set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
现阶段,你只需要了解SET指令可以用来显式的定义变量即可。
比如我们用到的是SET(SRC_LIST main.c),如果有多个源文件,也可以定义成:
set(SRC_LIST main.c t1.c t2.c)。

message指令的语法是:
message([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
这个指令用于向终端输出用户定义的信息,包含了三种类型:
SEND_ERROR,产生错误,生成过程被跳过。
SATUS — ,输出前缀为 的信息。

FATAL_ERROR,立即终止所有cmake 过程.
我们在这里使用的是STATUS 信息输出,演示了由PROJECT 指令定义的两个隐式变量
HELLO_BINARY_DIR和HELLO_SOURCE_DIR。

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存
放的位置。EXCLUDE_FROM_ALL参数的含义是将这个目录从编译过程中排除,比如,工程
的example,可能就需要工程构建完成后,再进入 example目录单独进行构建(当然,你
也可以通过定义依赖来解决此类问题)。
上面的例子定义了将src子目录加入工程,并指定编译输出(包含编译中间结果)路径为
bin目录。如果不进行 bin目录的指定,那么编译结果(包括中间结果)都将存放在
build/src 目录(这个目录跟原有的src目录对应),指定 bin 目录后,相当于在编译时
将src重命名为bin,所有的中间结果和目标二进制都将存放在bin目录。

src目录下的CMakeLists.txt


# 查找当前目录下的所有源文件,并将名称保存到 DIR_LIB_SRCS 变量aux_source_directory(. DIR_LIB_SRCS)# 添加目录
include_directories(../include)# 这里是设置保存库文件的路径的,不保存中间产物,库文件最后保存在build/lib中
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)# 生成链接库
add_library(add ${DIR_LIB_SRCS})message(STATUS "----------生成静态库完成----------" ${PROJECT_SOURCE_DIR}/add)

最后编译结果为:

进入build目录在linux目录行键入:cmake  ..   然后make

构建后,在build中会创建bin目录和lib目录还有对应的src,观察后会发现,src是中间产物,最终的可执行文件在bin文件夹下,src生成的库文件在lib文件夹下,大家多尝试修改,就明白了。

cmake使用教(一)多目录下多个文件的构建相关推荐

  1. 递归思想解决输出目录下的全部文件

    刚刚了解了下递归思想 递归就是在方法内调用本方法 下面说一个实际的应用 输出目录下的全部文件,当目录中还有目录时,则进入目录输出里面的文件 import java.io.*; class ShowFi ...

  2. 用bash命令得到Windows一个目录下的所有文件并且把结果输入到一个文件

    方式一: 只用如下一条语句就可以了: tree/f>index.txt 放入一个文件中命名为"****.bat" 双击就会在该目录下生成一个index.txt文件,在这个文件 ...

  3. python删除过期文件_Python删除指定目录下的过期文件的代码

    在代码过程中,将代码过程中比较常用的一些代码段做个备份,如下的代码是关于Python删除指定目录下的过期文件的代码,应该能对小伙伴也有帮助. import os import sys import t ...

  4. Apache Tomcat 曝文件包含漏洞:攻击者可利用该漏洞读取webapp目录下的任意文件...

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | oschina 来源 | https://ww ...

  5. python 递归目录_Python3:递归实现输出目录下所有的文件

    今天来整理一下os库中方法的使用,如何输出一个目录下的所有文件? 1.首先介绍几个基本的的方法: 1)os.getcwd()  #返回当前工作目录 2)os.listdir()    #返回一个列表, ...

  6. java 指定文件格式_java删除指定目录下指定格式文件的方法

    本文实例为大家分享了java删除指定目录下指定格式文件的具体代码,供大家参考,具体内容如下 正在看疯狂java讲义这本书,发现源码中有我不需要的class文件,想批量把它删除 代码如下: import ...

  7. TreeView获取目录下的所有文件

    /// <summary> /// TreeView获取目录下的所有文件 /// </summary> /// <param name="tree"& ...

  8. java 20 -3 递归之删除特定目录下的特定文件

    1 /* 2 需求:删除H:\demo目录下的带内容的文件 3 分析: 4 A:封装该目录 5 B:获取该目录下所有的文件或文件夹的File数组 6 C:遍历该File数组,获取每一个File对象 7 ...

  9. html复制文件到目录,复制指定目录下的全部文件到另一个目录中

    linux下文件的复制.移动与删除命令为:cp,mv,rm 复制指定目录下的全部文件到另一个目录中 假设复制源目录 为 dir1 ,目标目录为dir2.怎样才能将dir1下所有文件复制到dir2下了 ...

最新文章

  1. mysql 使用位运算
  2. 【Java集合框架】ArrayList类方法简明解析(举例说明)
  3. 三剑客”之Swarm应用数据持久化管理(volume 、bind 、 nfs)
  4. 写一副对子_挥毫泼墨写春联 西安街头年味分外浓
  5. NTU 课程辅助笔记: NFA到DFA的转化
  6. 数字图像处理实验(17):PROJECT 06-04,Color Image Segmentation
  7. 【代码】使用reentrantlock必须要手动释放锁
  8. heat 用法 示例
  9. Linux中crontab无法执行java程序的问题
  10. js 数字格式化,只能输入正负整数,小数
  11. SQLMAP 脱库过程(get请求)
  12. ad16怎么画弧线_ad15软件中如何画圆弧 多点画圆弧软件
  13. WEB前端面试选择题解答
  14. App隐私合规协议(第三方SDK)说明
  15. MS VC6 链接错误处理
  16. NDK-r25交叉编译glib-2.73.3
  17. mac book外接4k 显示器 字体大小问题
  18. Jenkins 用标签构建配置完后。 标签不显示
  19. python:tflearn训练的猫狗识别模型及其使用
  20. 为什么你的服务器总是被入侵?应该怎么防范提高服务器安全性。

热门文章

  1. 勘验图系统(GDI+绘图)
  2. NLP情感分析笔记(四):卷积情感分析
  3. Flink Table和SQL的基本API
  4. 初级算法——删除排序数组中的重复项
  5. 大数据分析的环节有哪些
  6. 大数据分析方法有哪些
  7. Vue3中的父子、子父组件通信
  8. stream流常用方法_Java8-Stream关键知识点
  9. java拆分日期_Java根据控制台输入的特定日期格式拆分日期
  10. [云计算]交换机二层端口access、trunk、hybird的理解