Makefile学习笔记02|动手编写第一个Makefile
希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢。
文件准备
- ~/make/src/first_make/first_make.cpp
//first_make.cpp
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
cout <<"test make "<<endl;
return 0;
}
直接使用make命令
#命令
make first_make
#结果
#g++ first_make.cpp -o first_make
#命令
./first_make
#结果
#test make
这是make的自动推导功能。在make后面传入目标名first_make,make会自动推导出所需的依赖文件first_make.cpp。这就完成了make的第一次使用,感觉是不是很简单呢。
使用Makefile做项目配置
首先,需要在代码的同路径,也就是~/make/src/first_make/下创建一个名为makefile或Makefile的文件。为了方便表述,下文中统一使用makefile。在我们输入make命令时,make会自动寻找当前目录下的名为makefile的文件。下面,我们开始编写第一个makefile文件。
#makefile包含几个部分,分别为:目标、依赖项、执行代码。目标以后会详细讲。依赖项就是说我要有通过依赖项来生成目标。
#目标:依赖项
first_make:first_make.cpp
#下面就是通过依赖项生成目标的语句。语句前需要加一个Tab键。注意,很多人会把vim等编辑器的Tab键配置成四个空格,这样会导致错误。建议取消这样的配置。
g++ first_make.cpp -o first_make
接下来我们开始使用刚刚编写的makefile。
#只需要输入一个make,make程序就可以自动去完成第一个目标。
make
#结果
g++ first_make.cpp -o first_make
如果出现了错误:make: ‘first_make’ is up to date.是因为之前编译时已经生成了first_make这个目标文件。此时可以输入一下命令来删除目标文件first_make。
rm first_make
代码中引入了第三方库
让我们修改一下first_make.cpp,引入线程库thread。
//first_make.cpp
#include <iostream>
#include <thread>
using namespace std;
void ThreadMain()
{
cout<<"Thread Main"<<endl;
}
int main(int argc, char *argv[])
{
thread th(ThreadMain);
cout <<"test make "<<endl;
th.join();
return 0;
}
让我们头铁试一下吧。结果出现了undefined reference to 'pthread_create’的错误。既然这样那就修改一下makefile吧。
first_make:first_make.cpp
g++ first_make.cpp -o first_make -lpthread
改好了,我们再试一下。
#命令
make
#结果
#g++ first_make.cpp -o first_make -lpthread
#生成了可执行文件first_make,让我们运行一下试试看。
./first_make
#打印结果
#test make Thread Main
多文件编译
在原目录~/make/src/first_make/下新建两个文件,分别是xdata.h和xdata.cpp。还要修改一下first_make.cpp。
//xdata.h
#ifndef XDATA_H
#define XDATA_H
class XData
{
public:
XData();
};
#endif
//xdata.cpp
#include <xdata.h>
#include <iostream>
using namespace std;
XData::XData()
{
cout<<"Create XData"<<endl;
}
//first_make.cpp
#include <iostream>
#include <thread>
#include "xdata.h"
using namespace std;
void ThreadMain()
{
cout<<"Thread Main"<<endl;
}
int main(int argc, char *argv[])
{
thread th(ThreadMain);
cout <<"test make "<<endl;
th.join();
XData d;
return 0;
}
虽然不是在同一个时间,但是在同一个撤硕,奥利给,编译了啊兄弟们!make一下。果然又出现了错误,这次的错误是:undefined refernce to ‘XData::XData()’,找不到函数定义。
那就再改一下makefile吧。
first_make:first_make.cpp xdata.cpp
g++ first_make.cpp xdata.cpp -o first_make -lpthread
这样再make一下就好了。这是只有这几个文件,动动手就能轻松解决问题。要是项目中有成百上千个文件,那不得累死我嘛😓。不用担心,后面学习了makefile的语法,自然有办法轻松解决。不管怎么样,这第一步算是迈出去了,相信要不了多久我们就可以掌握Makefile了。