当前位置: 首页 > article >正文

Makefile第十课:Makefile编译

目录

  • Makefile编译
    • 前言
    • 1.编译过程
      • 1.1 预处理
      • 1.2 编译成汇编语言
      • 1.3 编译成目标文件
      • 1.4 链接可执行文件
    • 2.CC++编译选项
    • 3.Implicit Rules
    • 4.编译带头文件的程序
    • 总结

Makefile编译

前言

学习杜老师推荐的Makefile教程视频,链接。记录下个人学习笔记,仅供自己参考。

之前有转载过杜老师的从零Makefile落地算法大项目文章,感兴趣的可以看看。

本课程主要讲解Makefile编译完整的带头文件的程序。

1.编译过程

1.1 预处理

示例如下:

cpp_srcs := $(shell find src -name *.cpp)

cpp_i := $(patsubst src/%.cpp,src/%.i,$(cpp_srcs))

src/%.i : src/%.cpp
	@g++ -E $< -o $@

preprocess : $(cpp_i)

debug : 
	@echo $(cpp_i)

clean :
	@rm -rf src/*.i

.PHONY : debug preprocess

1.2 编译成汇编语言

示例如下:

cpp_srcs := $(shell find src -name *.cpp)

cpp_s := $(patsubst src/%.cpp,src/%.s,$(cpp_srcs))

src/%.s : src/%.cpp
	@g++ -S $< -o $@

assemble : $(cpp_s)

debug : 
	@echo $(cpp_s)

clean :
	@rm -rf src/*.s

.PHONY : debug assemble

1.3 编译成目标文件

示例如下:

cpp_srcs := $(shell find src -name *.cpp)

cpp_objs := $(patsubst src/%.cpp,objs/%.o,$(cpp_srcs))

objs/%.o : src/%.cpp
	@mkdir -p $(dir $@)
	@g++ -c $< -o $@

objects : $(cpp_objs)

debug : 
	@echo $(cpp_objs)

clean :
	@rm -rf objs

.PHONY : debug clean objects

1.4 链接可执行文件

示例如下:

cpp_srcs := $(shell find src -name *.cpp)

cpp_objs := $(patsubst src/%.cpp,objs/%.o,$(cpp_srcs))

objs/%.o : src/%.cpp
	@mkdir -p $(dir $@)
	@g++ -c $< -o $@

workspace/pro : $(cpp_objs)
	@mkdir -p $(dir $@)
	@g++ $^ -o $@

run : workspace/pro
	@./$<

debug : 
	@echo $(cpp_objs)

clean :
	@rm -rf objs

.PHONY : debug clean

2.CC++编译选项

编译选项

  • -m64:指定编译为 64 位应用程序(x86_64架构)
  • -std=:指定编译标准,例如:-std=c++11、-std=c++14
  • -g:包含调试信息
  • -w:不显示警告
  • -O:优化等级,通常使用:-O3
  • -I:加在头文件路径前
  • fPIC:(Position-Independent Code),产生的没有绝对地址,全部使用相对地址,代码可以被加载到内存的任意位置,且可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的

链接选项

  • -l:加在库名前面
  • -L:加在库路径前面
  • -Wl,<选项>:将逗号分隔的 <选项> 传递给链接器
  • -rpath=:运行的时候去寻找的目录。运行的时候,要找 .so 文件,会从这个选项里指定的地方去找

3.Implicit Rules

大家约定俗成常用的一些变量名

  • CC: Program for compiling C programs; default cc
  • CXX: Program for compiling C++ programs; default g++
  • CFLAGS: Extra flags to give to the C compiler
  • CXXFLAGS: Extra flags to give to the C++ compiler
  • CPPFLAGS: Extra flags to give to the C preprocessor
  • LDFLAGS: Extra flags to give to compilers when they are supposed to invoke the linker

4.编译带头文件的程序

add.hpp

#ifndef ADD_HPP
#define ADD_HPP
int add(int a, int b);

#endif // ADD_HPP

add.cpp

int add(int a, int b)
{
    return a+b;
}

main.cpp

#include <stdio.h>
#include "add.hpp"

int main()
{
    int a=10; int b=5;
    int res = add(a, b);
    printf("a + b = %d\n", res);

    return 0;
}

Makefile

cpp_srcs := $(shell find src -name *.cpp)
cpp_objs := $(patsubst src/%.cpp,objs/%.o,$(cpp_srcs))

include_paths := include

I_flags := $(include_paths:%=-I%)

compile_options := -g -O3 -w $(I_flags)

objs/%.o : src/%.cpp
	@mkdir -p $(dir $@)
	@g++ -c $^ -o $@ $(compile_options)

workspace/pro : $(cpp_objs)
	@mkdir -p $(dir $@)
	@g++ $^ -o $@

run : workspace/pro
	@./$<

debug :
	@echo $(compile_options)
	@echo $(cpp_objs)

clean :
	@rm -rf objs workspace/pro

.PHONY : debug clean run

总结

本次课程学习了Makefile的编译和链接选项以及完整的带头文件程序的Makefile编译。


http://www.kler.cn/a/10339.html

相关文章:

  • 机器情绪及抑郁症算法
  • DHCP与FTP
  • vscode下nuget包的本地引入方法
  • Go开发指南-Gin与Web开发
  • [HarmonyOS]简单说一下鸿蒙架构
  • Python用CEEMDAN-LSTM-VMD金融股价数据预测及SVR、AR、HAR对比可视化
  • 当你觉得生活快熬不下去时,请你读一读《活着》
  • Elastic Enterprise Search 8.7:新连接器、网络爬虫提取规则和搜索分析客户端测试版
  • Golang数据类型比较
  • MongoDB
  • 使用 ArcGIS Pro 进行土地利用分类的机器学习和深度学习
  • SpringBoot常见的的面试点
  • ArrayList、LinkedList与Vector的区别?
  • 【自用】HTML笔记
  • VS Code 快捷键
  • 【C++11那些事儿(一)】
  • pandas读取Excel核心源码剖析,面向过程仿openpyxl源码实现Excel数据加载
  • 【RabbitMQ】
  • MATLAB算法实战应用案例精讲-【深度学习】多尺度特征融合(论文篇一)
  • Java知识点学习(第13天)
  • springboot零基础到项目实战
  • UI学习路线图2023完整版(适合自学)
  • 使用git log统计代码行数
  • 【K8S系列】深入解析无状态服务
  • 文件访问被拒绝?5个解决方法!
  • 云原生周刊:一文读懂 Pod 网络 | 2023.4.10