CMake学习笔记(三)

多个目录多个源文件

Posted by 婷 on December 7, 2019 本文总阅读量

这次是介绍多个目录多个源文件的CMakeLists.txt文件的编写。

课业繁多的十二月,鸽到现在才来写。

december.jpg

源文件代码

首先创建文件夹demo3,文件树如下。BSP文件夹是根目录demo3的一个子目录,里面有整个工程需要用到的源文件third.cpp和头文件third.h

demo3
├── another.cpp
├── another.h
├── BSP
│   ├── CMakeLists.txt
│   ├── third.cpp
│   └── third.h
├── build
├── CMakeLists.txt
└── main.cpp

11.png

先贴出所有的源文件跟头文件代码

根目录

main.cpp:

#include <iostream>
#include "another.h"
#include "BSP/third.h"

using namespace std;

int main(void)
{
  cout<<"this is main.cpp"<<endl;
  another_cout();
  third_cout();
  return 0;
}

another.cpp:

#include <iostream>
#include "another.h"

using namespace std;

void another_cout(void)
{
  cout<<"this is another.cpp"<<endl;
  cout<<"add another command"<<endl;
}

another.h:

#ifndef __ANOTHER_H
#define __ANOTHER_H

void another_cout(void);

#endif

BSP目录

third.cpp:

#include <iostream>

using namespace std;

void third_cout(void)
{
	cout<<"this is third.cpp"<<endl;
}

third.h:

#ifndef __THIRD_H
#define __THIRD_H

void third_cout(void);

#endif

CMakeLists

这一次的main.cpp里面有调用到BSP子目录下的源文件third.cpp里面的函数。所以根目录下的CMakeList.txt会跟以往的不一样,内容如下。

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)

# 项目信息
project (demo3)

# 查找目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. dir_source)

# 添加BSP目录
add_subdirectory(BSP)

# 指定生成目标
add_executable(main_another_third ${dir_source})

# 添加链接库BSP
target_link_libraries(main_another_third BSP_lib)

这一次生成的可执行文件的名字可一看到叫做main_another_third。相比较于上次的CMakeLists.txt文件,我们多了两句命令。add_subdirectory(BSP)target_link_libraries(main_another_third BSP_lib)

第一句命令,很好理解,因为我们要用到BSP目录下的东西所以添加BSP子目录。

第二句命令,注意编写的规则,main_another_third是我们的可执行文件,而BSP_lib是一个关于BSP里面内容的一个库,这个库怎么来的呢?别忘了BSP目录下还有一个CMakeLists.txt文件。

# BSP目录下的CMakeList.txt的内容
# 查找当前目录下的所有源文件,并将名称保存到 BSP_source 变量
aux_source_directory(. BSP_source)

# 指定生成 BSP_lib 链接库,跟根目录下的 CMakeLists.txt里面的链接库名称相对应
add_library (BSP_lib ${BSP_source})

可以看到通过add_library (BSP_lib ${BSP_source})生成了我们想要的有关BSP的库BSP_lib

编译执行

接下来的编译执行操作就跟之前一样,就不赘述了。

1.png

2.png

3.png