1.动手编写第一个makefile编译c++多文件项目
1.动手编写第一个makefile编译c++多文件项目
1.1 ubuntu 开发环境安装
• apt-get update #更新安装源
• apt-get install g++ #安装gcc和c++的开发库
• apt-get install gdb #调试工具
• apt-get install make
• apt-get install openssh-server #远程连接工具
• apt-get install vim #编辑工具
1.2 make直接编译
cmt@cmt-virtual-machine:~/src/first_make$ ls
first_make.cpp
cmt@cmt-virtual-machine:~/src/first_make$ make first_make
g++ first_make.cpp -o first_make
cmt@cmt-virtual-machine:~/src/first_make$ ./first_make
test make
first_make.cpp
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
cout << "test make" << endl;
return 0;
}
1.3 makefile
makefile文件中定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
makefile文件中会使用gcc编译器对源代码进行编译,最终生成可执行文件或者是库文件。
makefile文件的命名:makefile或者Makefile
makefile由一组规则组成,规则如下:
目标: 依赖
(tab)命令
makefile基本规则三要素:
▶目标: 要生成的目标文件
▶ 依赖: 目标文件由哪些文件生成
▶ 命令: 通过执行该命令由依赖文件生成目标
(1)第一个版本
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
cout << "test make" << endl;
return 0;
}
cmt@cmt-virtual-machine:~/src/first_make$ ls
first_make first_make.cpp
cmt@cmt-virtual-machine:~/src/first_make$ vim makefile
cmt@cmt-virtual-machine:~/src/first_make$ ls
first_make first_make.cpp makefile
cmt@cmt-virtual-machine:~/src/first_make$ make
make: “first_make”已是最新。
cmt@cmt-virtual-machine:~/src/first_make$ rm first_make
cmt@cmt-virtual-machine:~/src/first_make$ make
g++ first_make.cpp -o first_make
cmt@cmt-virtual-machine:~/src/first_make$
(2)第二个版本
修改
#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;
}
Windows中线程不需要引入C++11的线程库,LINUX中需要
cmt@cmt-virtual-machine:~/src/first_make$ vim first_make.cpp
cmt@cmt-virtual-machine:~/src/first_make$ make
g++ first_make.cpp -o first_make
/usr/bin/ld: /tmp/ccDQ16qL.o: in function `std::thread::thread<void (&)(), , void>(void (&)())':
first_make.cpp:(.text._ZNSt6threadC2IRFvvEJEvEEOT_DpOT0_[_ZNSt6threadC5IRFvvEJEvEEOT_DpOT0_]+0x33): undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status
make: *** [makefile:2:first_make] 错误 1
makefile文件
first_make:first_make.cpp
g++ first_make.cpp -o first_make -lpthread
cmt@cmt-virtual-machine:~/src/first_make$ make
g++ first_make.cpp -o first_make -lpthread
cmt@cmt-virtual-machine:~/src/first_make$ ./first_make
test make
Thread Main
cmt@cmt-virtual-machine:~/src/first_make$
(3)第三个版本
cmt@cmt-virtual-machine:~/src/first_make$ ls
first_make first_make.cpp makefile xdata.h
cmt@cmt-virtual-machine:~/src/first_make$ vim xdata.cpp
cmt@cmt-virtual-machine:~/src/first_make$ vim xdata.h
cmt@cmt-virtual-machine:~/src/first_make$ ll
总用量 52
drwxrwxr-x 2 cmt cmt 4096 8月 5 23:32 ./
drwxrwxr-x 3 cmt cmt 4096 7月 31 22:27 ../
-rwxrwxr-x 1 cmt cmt 25128 8月 5 23:20 first_make*
-rwxrwxrwx 1 cmt cmt 228 8月 5 23:13 first_make.cpp*
-rw-rw-r-- 1 cmt cmt 70 8月 5 23:19 makefile
-rw-rw-r-- 1 cmt cmt 112 8月 5 23:31 xdata.cpp
-rw-rw-r-- 1 cmt cmt 74 8月 5 23:32 xdata.h
cmt@cmt-virtual-machine:~/src/first_make$ vi first_make.cpp
cmt@cmt-virtual-machine:~/src/first_make$ vim makefile
cmt@cmt-virtual-machine:~/src/first_make$ make
g++ first_make.cpp xdata.cpp -o first_make -lpthread
cmt@cmt-virtual-machine:~/src/first_make$ ./first_make
test make
Thread Main
Create XData
cmt@cmt-virtual-machine:~/src/first_make$
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;
}
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;
}
makefile
first_make:first_make.cpp xdata.cpp
g++ first_make.cpp xdata.cpp - o first_make - lpthread
cmt@cmt-virtual-machine:~/src/first_make$ make
g++ first_make.cpp xdata.cpp -o first_make -lpthread
cmt@cmt-virtual-machine:~/src/first_make$ ./first_make
test make
Thread Main
Create XData
参考资料来源:夏曹俊