首页 > 编程语言 >1.动手编写第一个makefile编译c++多文件项目

1.动手编写第一个makefile编译c++多文件项目

时间:2024-08-10 16:05:02浏览次数:11  
标签:src make makefile c++ 编译 virtual cpp cmt first

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

参考资料来源:夏曹俊

标签:src,make,makefile,c++,编译,virtual,cpp,cmt,first
From: https://www.cnblogs.com/codemagiciant/p/18352397

相关文章

  • 2024年华为OD机试真题-推荐多样性-C++-OD统一考试(C卷D卷)
    2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述:推荐多样性需要从多个列表中选择元素,一次性要返回N屏数据(窗口数量),每屏展示K个元素(窗口大小),选择策略:1.各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一个元素,再从第二个列......
  • c++习题18-计算鞍点
    目录一,题目二,思路三,代码一,题目给定一个5×5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。例如:在下面的例子中(第4行第1列的元素就是鞍点,值为8)。11356912478101056......
  • c++习题20-百钱百鸡
    目录一,题目二,思路三,代码 一,题目农夫约翰今天来到了畜牧市场,想给自己的农场里买点鸡回去。已知公鸡一只5块钱,母鸡3块钱,小鸡崽子一块钱三只。农夫手里有N元,他想买N只鸡,但是他跟ljc一样数学不好,想让你帮他算一算有几种买法,以方便他挑选。输入描述一个整数N,约翰手里的钱......
  • C++ 类型转换
    目录0.前言1.C语言类型转换1.1隐式类型转换1.2显式类型转换2.C++强制类型转换2.1static_cast2.2reinterpret_cast2.3const_cast2.4dynamic_cast3.为什么C++需要4种强制类型转换3.1类型转换的多样性需求3.2提高类型转换的安全性3.3提供更明确的语义3.4支持高......
  • C++标准库函数
    很多人用C++就是因为C++有很多方便的函数,所以我来科普一下方便的输入输出函数:scanf(); 高效的输入(TLE的可以和printf一起用,很快!)格式:输入变量a:scanf(...,&a);一定要加&(取地址)...是按a的类型来定的:%d:int%lld:longlong%lf:double%c:charprintf(); ......
  • 【数据结构与算法】输出二叉树中从每个叶子结点到根结点的路径 C++实现(二叉树+栈+深度
    二叉树叶子节点到根节点的路径题目描述给定一棵二叉树的后序遍历序列post[s1..t1]和中序遍历序列in[s2..t2],设计一个算法,输出二叉树中从每个叶子节点到根节点的路径。请使用栈的数据结构解决。输入格式输入包括两行:第一行为后序遍历序列post[s1..t1]。第二行为中序......
  • C++类和对象(上)
    文章目录一、类的定义1、类的定义格式2、访问限定符3、类域二、实例化1、实例化概念2、对象的大小三、this指针一、类的定义1、类的定义格式calss是定义类的关键词,用法更C语言中的结构体struct关键词用法一样,区别是类可以在里面创建函数,当然在C++中也是兼容结......
  • C++day05
    1>思维导图2>搭建一个货币的场景,创建一个名为RMB的类,该类具有整型私有成员变量yuan(元)、jiao(角)和fen(分),并且具有以下功能:(1)重载算术运算符+和-,使得可以对两个RMB对象进行加法和减法运算,并返回一个新的RMB对象作为结果。(2)重载关系运算符>,判断一个RMB对象是......
  • C++day04
    1】思维导图2】完成关系运算符重载,实现成员函数和全局函数的版本。#include<iostream>usingnamespacestd;classStu{friendbooloperator<(constStu&L,constStu&R);private:intage;intid;public:Stu(){}Stu(intage,intid):age(age)......
  • C++day03
    1>思维导图2>设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象p1,设计这两个类的构造函数、析构函数和拷贝构造函数。#include<iostream>usingnamespacestd;classPer{private:stringname;......