ubuntu 使用makefile编译c++文件

学习笔记

单纯记录在ubuntu编译过程

一、在相同目录下编译多文件

在这里插入图片描述

main.cpp

#include <iostream>
#include "myhead.h"

using namespace std;

int main()
{
        print();
        Testprint();
        //cout<<"Test"<<endl;
        return 0;
}

myhead.h

#ifndef __myhead_h
#define __myhead_h

void print();
void Testprint();

#endif

myhead.cpp

#include <iostream>
#include "myhead.h"

using namespace std;

void print()
{
        cout<<"printFunc"<<endl;
        return;
}

void Testprint()
{
        cout<<"TestprintFunc"<<endl;
        return;
}

编写makefile

main: main.o myhead.o

        g++ -o main main.o myhead.o
main.o: main.cpp
        gcc -c main.cpp

myhead.o: myhead.cpp
        gcc -c myhead.cpp

clear:
        rm -f *.o main

1、编写完成后运行(注意权限,如果不是root在前面加上sudo)

make

生成 main.o、myhead.o和main执行文件
在这里插入图片描述

在这里插入图片描述

2、运行main查看结果

./main

在这里插入图片描述

3、清理文件(注意权限,如果不是root在前面加上sudo)

make clear

在这里插入图片描述

注:如编译过程中有遇到以下问题

main.o:在函数‘__static_initialization_and_destruction_0(int, int)’中:
main.cpp:(.text+0x38):对‘std::ios_base::Init::Init()’未定义的引用
main.cpp:(.text+0x47):对‘std::ios_base::Init::~Init()’未定义的引用
myhead.o:在函数‘print()’中:
myhead.cpp:(.text+0xa):对‘std::cout’未定义的引用
myhead.cpp:(.text+0xf):对‘std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)’未定义的引用

解决方案:
因使用的是c++文件编译导致的,gcc -c默认编译.c文件的,
所以需将gcc -o main main.o myhead.o修改成

gcc -o main main.o myhead.o -lstdc++
或
g++  -o main main.o myhead.o 

在这里插入图片描述

二、在不同目录下编译多文件

在这里插入图片描述

如果直接使用make的话会报错,找不到myhead文件
需要通过 -I 选项 链接上去。重新编译

如果到只在Testgcc文件目录下使用gcc编译,那么就需要将makefile修改成。如需想更简单的话
如:
main.o: main.cpp myhead/myhead.h
可改成
main.o: main.cpp

main: main.o myhead.o
        gcc -o main main.o myhead.o -lstdc++
        
main.o: main.cpp myhead/myhead.h
        gcc -c main.cpp -I./myhead/

myhead.o: myhead/myhead.cpp myhead/myhead.h
        gcc -c myhead/myhead.cpp -I./myhead/

clear:
        rm -f *.o main

注:如果有出现以下这种错误信息,是因为空格与Tab的问题,把gcc前面的空格修改成Tab就可以了

makefile:9: *** missing separator (did you mean TAB instead of 8 spaces?)。 停止。

编译没问题:
在这里插入图片描述
在Testgcc目录下生成了 main.o、myhead.o与main执行文件
在这里插入图片描述

试着运行main执行文件
在这里插入图片描述

没问题,OK

参考文章
https://www.jianshu.com/p/e5c6a255076b

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值