CMake学习笔记(二)

同个目录下多个源文件

Posted by 婷 on November 26, 2019 本文总阅读量

今天来记录下如何用cmake来编译同个目录下的多个源文件,生成可执行文件的过程。


文件目录结构

demo2文件夹下的文件树如下:

demo2
├── another.cpp
├── another.h
├── build
├── CMakeLists.txt
└── main.cpp

CMakeLists文件内容如下:

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

# 项目名称
project (demo2)

#产生可执行文件,名字叫做 main_another
add_executable(main_another main.cpp another.cpp)

main.cpp

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

using namespace std;

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

another.cpp

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

using namespace std;

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

another.h

#ifndef __ANOTHER_H
#define __ANOTHER_H

void another_cout(void);

#endif

编译与执行

打开终端,进入build文件夹,然后执行cmake..命令。

1.png

ls命令可以看到经过了cmake后产生了Makefile文件,在这个有Makefile文件的目录下,执行make命令。

2.png

3.png

可以看到现在产生了我们需要的可执行文件main_another。运行这个可执行文件就可看到程序的输出啦。

5.png


新的命令

不过这个目录下只有两个源文件main.cppanother.cpp,所以在CMakeLists.txt最后添加可执行文件的命令看起来还不太长。

4.png

如果同个目录下有很多个源文件那怎么办呢,这时候就可以使用aux_source_directory(<dir> <variable>)命令啦。这个命令的作用是:去查找指定目录下<dir>的所有源文件,然后把这些结果全部都存在<variable>这个变量里面。比如

aux_source_directory(.  dir_source)

这句命令的意思是在当前目录下也就是 . 寻找所有的源文件,然后赋给变量dir_source

生成我们想要的可执行文件的命令也相应改成

add_executable(main_another ${dir_source})

(不难理解,在Linux中,.一个点代表是当前目录,..两个点是代表上一级目录,$shell脚本编程中在变量名前表示引用这个变量)

所以我们的CMakeList.txt文件还可以这么写:

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

# 项目名称
project (demo2)

#在当前目录下寻找所有的源文件,赋给变量dir_source。
aux_source_directory(.  dir_source)

#产生可执行文件,名字叫做 main_another
add_executable(main_another ${dir_source})

然后我们在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;
}

按照上面的流程,先在build目录下cmake ..,然后make,最后执行可执行文件main_another

6.png


#include <>和 #include “”

最后说说c++#include""<>的问题。

如果是""的话,一般是指查找你这个源文件当前目录下的头文件,而<>一般是指查找标准库的头文件。

现在在main.cpp里面我包含头文件的方式改成#include <another.h>

7.png

cmake产生Makefile文件后,当我要执行make命令产生可执行性文件时,报错了。

8.png