zoukankan      html  css  js  c++  java
  • 学习makefile的一个工程示例

    前言

    makefile推荐资料为陈皓的跟我一起写makefile,需要pdf资源的可以私我

    正文

    基础知识

    g++ [-I文件夹1:文件夹2]  文件a 

    表示的是在编译文件a时,其头文件除了系统默认的位置,还要查询文件夹1和文件夹2下有没有对应的文件

    makefile中的基本文法为以下加粗部分:

    目标1 目标2 目标3... : 依赖1 依赖2 依赖3... 

      命令1

      命令2

      命令3...

    其中

    $^代表所有的依赖对象

    $<代表第一个依赖对象

    $@ 代表所有目标

    工程目录结构

    ---include(放置头文件.h)

    ------student.h(Student类的头文件)

    ---src(放置源文件.cc)

    ------student.cc(Student类的定义文件)

    ------main.cc(main文件)

    ------makefile(子makefile,将.cc编译为.o)

    ---obj(放置编译临时文件.o)

    ------makefile(子makefile,将.o链接为可执行文件)

    ---bin(放置生成的可执行文件)

    ---makefile(主makefile,调用子makefile进行项目构建)

    文件介绍

    student.h和student.cc完成一个类,main函数中创建student类,其中main.cc和student.cc头文件包含了student.h
    主makefile(主makefile,调用子makefile进行项目构建)

     1 CC = g++  #因为是C++代码,定义编译方式为g++
     2 TOP_DIR := ${PWD} #定义当前makefile文件位置
     3 SUB_DIR := src obj  #工程中含有makefile,需要进行make的文件夹
     4 BIN := hello  #定义最终生成可执行文件的名称
     5 BIN_DIR := ${TOP_DIR}/bin  #定义最终生成可执行文件的放置位置
     6 OBJ = main.o student.o  #定义中间需要生成的中间文件
     7 OBJ_DIR := $(TOP_DIR)/obj  #定义中间文件需要放置的文件夹
     8 INCLUDE := ${TOP_DIR}/include  #定义头文件放置位置
     9 SRC := ${TOP_DIR}/src  #定义源文件放置的位置
    10 VPATH := ${INCLUDE}:${SRC}  #定义头文件及源文件查找的位置,不设置会导致在编译时找不到头文件或者源文件
    11 export CC :TOP_DIR OBJ OBJ_DIR BIN_DIR BIN INCLUDE SRC VPATH  #将以上变量导出为全局变量,这样在子makefile也能能够直接使用
    12 
    13 all: CHECKDIR $(SUB_DIR)  #当执行make命令时,首先要执行all这段,其依赖于CHECKDIR和${SUB_DIR}的构建
    14 CHECKDIR:            
    15     mkdir -p $(SUB_DIR) $(BIN_DIR)  #构建执行中所需要的文件夹,包括src obj(已经存在),和bin
    16 $(SUB_DIR):ECHO  #依赖ECHO,以及编译所有的源码,生成${SUB_DIR}的中间文件,这里等价与执行了make -C ./src ./obj 
    17     make -C $@
    18 ECHO:
    19     @echo $(SUB_DIR)  #打印正在makefile的位置
    20     @echo bengin compile  #打印开始进行该部分的编译
    21 clean:   #删除obj文件夹下的所有的.o文件以及bin文件夹下的所有文件
    22     -rm -rf $(OBJ_DIR)/*.o $(BIN_DIR)

    src下的makefile(子makefile,将.cc编译为.o)

    1 #vpath %.h ${INCLUDE}  #已经被注释掉了,因为主makefile已经传递了VPATH的变量
    2 #vpath %.cc ${SRC}  
    3 all : $(OBJ_DIR)/main.o $(OBJ_DIR)/student.o  #分别编译main.cc和student.cc
    4 $(OBJ_DIR)/main.o : main.cc student.h
    5     $(CC) -c $< -I${INCLUDE} -o $@
    6 $(OBJ_DIR)/student.o : student.cc student.h
    7     $(CC) -c $< -I${INCLUDE} -o $@

    obj下的makefile(子makefile,将.o链接为可执行文件)

    1 #BIN_DIR := ../bin
    2 #BIN := hello
    3 #OBJ := main.o student.o
    4 #CC = g++
    5 $(BIN_DIR)/$(BIN):$(OBJ)  #将生成的中间文件链接构建执行文件
    6     $(CC) $^ -o $@

    student.h

     1 #ifndef _STUDENT
     2 #define _STUDENT
     3 #include <string>
     4 class Student
     5 {
     6 public:
     7     Student(int id,std::string name);
     8     std::string getName();
     9 private:
    10     int id;
    11     std::string name;
    12 };
    13 #endif

    student.cc

    1 #include "student.h"
    2 Student::Student(int id,std::string name):id(id),name(name){
    3 
    4 }
    5 std::string Student::getName()
    6 {
    7     return name;
    8 }

    main.cc

    1 #include "student.h"
    2 Student::Student(int id,std::string name):id(id),name(name){
    3 
    4 }
    5 std::string Student::getName()
    6 {
    7     return name;
    8 }

     make后的工程目录为

    ---include(放置头文件.h)

    ------student.h(Student类的头文件)

    ---src(放置源文件.cc)

    ------student.cc(Student类的定义文件)

    ------main.cc(main文件)

    ------makefile(子makefile,将.cc编译为.o)

    ---obj(放置编译临时文件.o)

    ------student.o

    ------main.o

    ------makefile(子makefile,将.o链接为可执行文件)

    ---bin(放置生成的可执行文件)

    ------hello(可执行文件)

    ---makefile(主makefile,调用子makefile进行项目构建)

  • 相关阅读:
    win安装Theano
    Photoshop
    Sublime Text与LaTeX的结合
    Python开源库的bug
    Pillow库的学习和使用
    对OpenSSL心脏出血漏洞的试验
    Scrapy的学习和使用
    FreeImage库的学习和使用
    gdal库的学习和使用
    VirtualBox安装Debian
  • 原文地址:https://www.cnblogs.com/pcxie/p/8000170.html
Copyright © 2011-2022 走看看