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

参考资料来源:夏曹俊

posted @ 2024-08-10 16:07  CodeMagicianT  阅读(45)  评论(0编辑  收藏  举报