今天来记录下如何用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..
命令。
ls
命令可以看到经过了cmake
后产生了Makefile
文件,在这个有Makefile
文件的目录下,执行make
命令。
可以看到现在产生了我们需要的可执行文件main_another
。运行这个可执行文件就可看到程序的输出啦。
新的命令
不过这个目录下只有两个源文件main.cpp
跟another.cpp
,所以在CMakeLists.txt
最后添加可执行文件的命令看起来还不太长。
如果同个目录下有很多个源文件那怎么办呢,这时候就可以使用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
。
#include <>和 #include “”
最后说说c++
#include""
和<>
的问题。
如果是""
的话,一般是指查找你这个源文件当前目录下的头文件,而<>
一般是指查找标准库的头文件。
现在在main.cpp
里面我包含头文件的方式改成#include <another.h>
。
cmake
产生Makefile
文件后,当我要执行make
命令产生可执行性文件时,报错了。