【Make编译控制 04】Makefile项目编译

目录

一、编译选项

二、链接选项

三、项目编译


一、编译选项

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

二、链接选项

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

三、项目编译

在一个工程项目中,通常包含有多个头文件、源文件,有时候为了打包成库,也需要管理多个目标文件,所以我们需要通过 Makefile 进行工程项目的编译和管理。

项目示例概述:

  1. 项目包含两个头文件:add.hpp、sub.hpp
  2. 每个头文件对应一个源文件:add.cpp、sub.cpp
  3. 有一个主函数源文件:main.cpp
// add.hpp头文件#pragma once
int add(int a, int b);
// sub.hpp头文件#pragma once
int sub(int a, int b);
// add.cpp源文件#include "add.hpp"int add(int a, int b) {return a + b;
}
// sub.cpp源文件#include "sub.hpp"int sub(int a, int b) {return a - b;
}
#include <iostream>
#include "add.hpp"
#include "sub.hpp"int main() {std::cout << "10 + 5 = " << add(10, 5) << std::endl;std::cout << "10 - 5 = " << sub(10, 5) << std::endl;return 0;
}
# makefile文件cpp_srcs := $(shell find src/ -name *.cpp)
cpp_objs := $(patsubst src/%.cpp,objs/%.o, $(cpp_srcs))# 头文件绝对路径
include_paths := /root/gitee/Test/Make_Learn/07_test/include/I_flags := $(include_paths:%=-I%)
# 也可以用 foreach 函数compile_opts = -w -O3 -m64 $(I_flags)objs/%.o : src/%.cpp@g++ -c $^ -o $@ $(compile_opts)execs/math : $(cpp_objs)@mkdir -p execs@g++ $^ -o $@run : execs/math@./$<gdbs/math_g : $(cpp_objs)@mkdir -p gdbs@g++ $^ -o $@ -ggdb : gdbs/math_g@gdb $<test :@echo $(cpp_srcs)@echo $(cpp_objs)@echo $(I_flags)clean:@rm -rf objs/*.o execs gdbs.PHONY: run gdb test clean
(base) [root@localhost 07_test]# tree .
.
├── include
│   ├── add.hpp
│   └── sub.hpp
├── makefile
├── objs
└── src├── add.cpp├── main.cpp└── sub.cpp3 directories, 6 files
(base) [root@localhost 07_test]# make run
10 + 5 = 15
10 - 5 = 5
(base) [root@localhost 07_test]# tree .
.
├── execs
│   └── math
├── include
│   ├── add.hpp
│   └── sub.hpp
├── makefile
├── objs
│   ├── add.o
│   ├── main.o
│   └── sub.o
└── src├── add.cpp├── main.cpp└── sub.cpp4 directories, 10 files
(base) [root@localhost 07_test]# make clean
(base) [root@localhost 07_test]# tree .
.
├── include
│   ├── add.hpp
│   └── sub.hpp
├── makefile
├── objs
└── src├── add.cpp├── main.cpp└── sub.cpp3 directories, 6 files
(base) [root@localhost 07_test]# make gdb
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/gitee/Test/Make_Learn/07_test/gdbs/math_g...(no debugging symbols found)...done.
(gdb) r
Starting program: /root/gitee/Test/Make_Learn/07_test/gdbs/math_g 
10 + 5 = 15
10 - 5 = 5
[Inferior 1 (process 30835) exited normally]
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64 libgcc-4.8.5-44.el7.x86_64 libstdc++-4.8.5-44.el7.x86_64
(gdb) quit
(base) [root@localhost 07_test]# tree .
.
├── gdbs
│   └── math_g
├── include
│   ├── add.hpp
│   └── sub.hpp
├── makefile
├── objs
│   ├── add.o
│   ├── main.o
│   └── sub.o
└── src├── add.cpp├── main.cpp└── sub.cpp4 directories, 10 files
(base) [root@localhost 07_test]#

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/677230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV与机器学习:使用opencv和sklearn实现线性回归

前言 线性回归是一种统计分析方法&#xff0c;用于确定两种或两种以上变量之间相互依赖的定量关系。在统计学中&#xff0c;线性回归利用线性回归方程&#xff08;最小二乘函数&#xff09;对一个或多个自变量&#xff08;特征值&#xff09;和因变量&#xff08;目标值&#…

深度优先搜索(DFS)与广度优先搜索(BFS):探索图与树的算法

一、引言 在图论和树形结构中&#xff0c;搜索算法是寻找从起点到终点的路径的关键。其中&#xff0c;深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&#xff08;BFS&#xff09;是最常用且最基础的两种搜索算法。本文将详细介绍广度优先搜索&#xff08;BFS&#xf…

一文彻底搞懂Kafka如何保证消息不丢失

文章目录 1. kafka 架构2. producer端是如何保证数据不丢失的2.1 同步发送2.2 异步发送2.3 批量发送 3. consumer端是如何保证数据不丢失的3.1 手动提交3.2 幂等性消费 4. broker端是如何保证数据不丢失的4.1 副本机制4.2 ISR机制4.3 刷盘机制 1. kafka 架构 Producer&#xff…

ES6 ~ ES11 学习笔记

课程地址 ES6 let let 不能重复声明变量&#xff08;var 可以&#xff09; let a; let b, c, d; let e 100; let f 521, g "atguigu", h [];let 具有块级作用域&#xff0c;内层变量外层无法访问 let 不存在变量提升&#xff08;运行前收集变量和函数&#…

基于SpringBoot+Vue的服装销售商城系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

电脑数据误删如何恢复?9 个Windows 数据恢复方案

无论您是由于软件或硬件故障、网络犯罪还是意外删除而丢失数据&#xff0c;数据丢失都会带来压力和令人不快。 如今的企业通常将其重要数据存储在云或硬盘上。但在执行其中任何一项操作之前&#xff0c;您很有可能会丢失数据。 数据丢失的主要原因是意外删除&#xff0c;任何…

springBoot,springSecurity返回乱码

框架&#xff1a;SpringBoot3 问题&#xff1a;响应内容乱码 问题代码&#xff1a; // 成功登录响应的内容Overridepublic void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication…

redis单线程还快的原因

1. 内存存储和高效数据结构&#xff1a; 内存存储&#xff1a; Redis将数据存储在内存中&#xff0c;因此可以实现非常高的读写速度&#xff0c;而无需频繁的磁盘I/O操作。 高效数据结构&#xff1a; Redis内置了丰富且高效的数据结构&#xff0c;如字符串、哈希表、列表、集合…

【EEG信号处理】对信号进行模拟生成

生成信号的目的还是主要是为了学习和探究后面的分析方法&#xff1b;本文主要是对方法进行整理 瞬态 transient 瞬态信号是指的是一瞬间信号上去了&#xff0c;这种情况我们可以用在时域上高斯模拟 peaktime 1; % seconds width .12; ampl 9; gaus ampl * exp( -(EEG.tim…

16.JS实现非负大整数相加

JavaScript对数值有范围的限制&#xff0c;限制如下&#xff1a; Number.MAX_VALUE // 1.7976931348623157e308 Number.MAX_SAFE_INTEGER // 9007199254740991 Number.MIN_VALUE // 5e-324 Number.MIN_SAFE_INTEGER // -9007199254740991 如果想要对一个超大的整数(> Numb…

滑块验证码识别代码分享

平时我们开发爬虫会遇到各种各样的滑动验证码&#xff0c;如下图所示&#xff1a; 为了解决这个问题&#xff0c;我写了一个通用的滑块验证码识别代码&#xff0c;主要是分析图片&#xff0c;然后计算出滑块滑动的像素距离。但是像素距离大多数情况下都不会等于滑动距离&#x…

知到答案在哪搜? #微信#笔记#其他

学习工具是我们的得力助手&#xff0c;帮助我们更好地组织学习内容和时间。 1.试题猪 这是一个公众号 总体来说还是很不错的&#xff0c;题库虽然不是特别全&#xff0c;但是大部分网课答案能够查询到&#xff0c;最重要的是免费的 下方附上一些测试的试题及答案 1、实验室…

每日五道java面试题之java基础篇(四)

第一题. 访问修饰符 public、private、protected、以及不写&#xff08;默认&#xff09;时的区别&#xff1f; Java 中&#xff0c;可以使⽤访问控制符来保护对类、变量、⽅法和构造⽅法的访问。Java ⽀持 4 种不同的访问权限。 default (即默认&#xff0c;什么也不写&…

[职场] 职场上该如何和同事相处呢?七种方法教你和同事友好相处 #其他#媒体

职场上该如何和同事相处呢&#xff1f;七种方法教你和同事友好相处 在职场上&#xff0c;如何和同事相处是一堂必修课。同事&#xff0c;是我们天天必须看到的人&#xff0c;只有和同事友好相处&#xff0c;我们才能生活得更好&#xff0c;工作得更好。那么&#xff0c;我们在…

作业2024/2/5

第四章 堆与拷贝构造函数 一 、程序阅读题 1、给出下面程序输出结果。 #include <iostream.h> class example {int a; public: example(int b5){ab;} void print(){aa1;cout <<a<<"";} void print()const {cout<<a<<endl;} …

线程相关知识梳理

一、概念 线程是轻量级的进程&#xff0c;被包含在进程之中&#xff0c;多个线程使用同一片进程空间。进程是操作系统资源分配的最小单位 &#xff0c;线程是操作系统运算调度的最小单位。 二、优/劣势 优势&#xff1a;解决了进程间切换耗费时间的问题&#xff0c;由于使用…

代码随想录算法训练营day15||二叉树part02、102.二叉树的层序遍历、 226.翻转二叉树(优先掌握递归)、101. 对称二叉树 (优先掌握递归)

102.二叉树的层序遍历 题目&#xff1a;给你一个二叉树&#xff0c;请你返回其按 层序遍历 得到的节点值。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 接下来我们再来介绍二叉树的另一种遍历方式&#xff1a;层序遍历。 层序遍历一个二叉树。就是…

零售行业供应商数据分发,怎样提高安全性和效率?

零售行业是我国经济发展的重要组成&#xff0c;零售行业包罗万象&#xff0c;如包括汽车零售、日化零售、快消品零售等&#xff0c;不同细分行业的运营模式各不相同&#xff0c;但大体来说&#xff0c;零售行业都具备最基础的供应商和零售商&#xff0c;供应商将商品或服务卖给…

python WEB接口自动化测试之requests库详解

由于web接口自动化测试需要用到python的第三方库--requests库&#xff0c;运用requests库可以模拟发送http请求&#xff0c;再结合unittest测试框架&#xff0c;就能完成web接口自动化测试。 所以笔者今天先来总结一下requests库的用法。希望对大家&#xff08;尤其是新手&…

机器学习系列——(二十二)结语

随着我们的机器学习系列的探索画上句号&#xff0c;我们不禁感慨于这一领域的广阔和深邃。从最初的基础概念到复杂的算法&#xff0c;从理论的探讨到实际应用的示例&#xff0c;我们一起经历了一段非凡的旅程。机器学习不仅是当前技术创新的核心驱动力之一&#xff0c;也是塑造…