【Linux】GNU编译器基础

文章目录

    • GCC
    • Makefile、make

GCC

   常见的GNU编译器是GCC其包含gcc以及g++等,适用于C/C++中,在Windows系统中通常使用IDE进行程序的编写和编译、链接等操作,但在Linux系统中通常使用GNU编译器来进行,对于C/C++等高级语言需要进行预编译、编译、汇编、链接最后才能生成可执行文件使用。实际使用直接g++ test.cpp -o test.out && ./test.out生成可执行文件test.out并运行,如果不用-o指定生成名称的话即g++ test.cpp && ./a.out则默认生成a.out

GNU编译器基本选项说明实例
-E预编译:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法; 生成.i预处理文件g++ -E test.cpp -o test.i
-S编译:检查语法,将预处理后文件编译,生成.s汇编文件g++ -S test.i -o test.s
-c汇编:将汇编文件生成目标文件(二进制文件); 生成.o文件(机器码)g++ -c test.s -o test.o
-o链接、指定输出文件的名称。当与编译和链接命令一起使用时,它指示编译器或链接器将最终的可执行文件或库输出到指定的文件名g++ test.o -o test.out
-D程序编译时,指定一个宏定义g++ test.cpp -o test.out -D MAX_NUM
-w编译时不生成任何警告g++ test.cpp -o test.out -w
-Wall编译时生成全部警告g++ test.cpp -o test.out -Wall
-std指定编译的标准g++ -std=c++11 test.cpp -o test.out
-l编译时指定使用到的库----
-L编译时指定库的路径----
-g编译时生成调试信息,可以进行调试----

Makefile、make

   一个项目通常有多个源文件,如果要使用GNU编译器逐个编译的话则十分复杂例如g++ a.cpp b.cpp c.cpp d.cpp -o test.out所以使用Makefile文件对编译的规则进行封装,指定不同源文件的编译顺序以及编译规则,最后使用make命令进行自动编译,当前目录下使用make命令会自动进入Makefile文件并按照其中规定的规则进行编译。

  • 命名:makefile/Makefile
  • 规则:一个makefile文件中有一个或者多个规则,如下为一个基本规则。
目标 ...(可以多个):依赖 ...命令(必须TAB缩进)...
...
test.out:a.cpp b.cpp c.cpp d.cpp g++ a.cpp b.cpp c.cpp d.cpp -o test.out

目标即最终要生成的文件例如test.out
依赖则是生成目标所需要的文件例如a.cpp b.cpp c.cpp d.cpp
命令则对依赖执行操作生成目标例如g++必须使用TAB缩进

  • 原理:某个规则中的命令执行前检查规则中的依赖,存在则执行不存在则继续向下检查是否有规则是生成该依赖的有则首先执行生成依赖的其他规则其他规则都是为第一个规则服务
test.out:a.o b.o c.o g++ a.o b.o c.o -o test.outa.o:a.cpp //生成依赖a.o规则g++ -c a.cpp -o a.ob.o:b.cpp //生成依赖b.o规则g++ -c b.cpp -o b.oc.o:c.cpp //生成依赖c.o规则g++ -c c.cpp -o c.o
  • 检测更新:在执行规则中的命令时。会比较目标和依赖的文件时间,如果依赖的时间较晚则需要重新生成目标仅对更改的依赖和最终的生成目标的规则重新执行其他未变动的规则不用执行。
  • 变量:
      自定义变量:变量名=变量值 var=world $(var) //通过符号$获取变量的内容==world
预定义变量说明
AR归档维护程序的名称,默认为ar
CCC编译器名称,默认为cc
CXXC++编译器的名称,默认为g++
$@目标的完整名称,只可在命令中使用
$<第一个依赖文件的名称,只可在命令中使用
$^所有的依赖文件,只可在命令中使用
test.out:a.cpp b.cpp c.cpp d.cpp $(CXX) $^ -o $@ //等价于g++ a.cpp b.cpp c.cpp d.cpp -o test.out//可直接使用自定义变量
target=test.out
origin=a.cpp b.cpp c.cpp d.cpp$(target):$(origin)$(CXX) $(origin) -o $(target)
  • 模式匹配%即为一个通配符,匹配一个字符串。
target=test.out
origin=a.o b.o c.o
$(target):$(origin)$(CXX) $(origin) -o $(target)%.o:%.cpp //多次匹配生成依赖a.o、b.o、c.o的规则$(CXX) -c $< -o $@
  • 函数
函数功能参数返回实例
$(wildcard ..)获取指定目录下的指定类型的文件列表某个或多个目录下对应的某种类型的文件,多个目录用空格间隔得到若干个文件的文件列表,文件名使用空格间隔$(wildcard ./*.c ./*.o)//获取当前目录所有.c和.o文件
$(patsubst . .. ...)查找...中的字符串和.的字符串是否符合,一致则转化为..字符串均可以使用通配符%表示任意字符串返回被替换后的字符串$(patsubst %.c %.o a.c b.c c.c )//返回为a.o b.o c.o 仅进行字符串的改变不改变文件的本身属性
target=test.out
origin=$(wildcard ./*.c)
index=$(patsubst %.c %.o $(origin))$(target):$(index)$(GXX) $(index) -o $(target)
%.o:%.c$(GXX) -c $< -o $@.PHONY:clean //尾目标,不会生成文件
clean: //删除所有的.o文件,使用外部命令行使用make clean即可rm ./*.o  //必须使用TAB缩进

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

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

相关文章

亚马逊对IP的要求是什么?

IP的全称为Internet Protocol&#xff0c;是TCP/IP体系中的网际层协议&#xff0c;IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。IP规定网络上所有的设备都必须有一个独一无二的IP地址&#xff0c;就好比是邮件上都必须注明收件人地址&#xff0c;邮递员才能…

函数递归输出1~100的数字及递归的栈溢出问题

什么是递归&#xff1f; 递归就是函数⾃⼰调⽤⾃⼰递归中的递就是递推的意思&#xff0c;归就是回归的意思如果递归就像循环一样&#xff0c;打一个大的复杂问题转化一个小的问题&#xff0c;但是要与原问题相似&#xff0c;分解成规模较⼩的⼦问题来求解&#xff1b;直到⼦问…

Spark SQL数据源 - 基本操作

Spark SQL 提供了丰富的API来与各种数据源进行交互&#xff0c;包括Parquet、JSON、CSV、JDBC等。以下是一些使用Spark SQL与数据源进行基本操作的基本步骤和示例代码。 1. 初始化SparkSession 首先&#xff0c;你需要初始化一个SparkSession对象&#xff0c;这是Spark SQL的…

【scau大数据技术与原理2】综合性实验Spark集群的安装和使用——安装启动spark shell篇

实验内容简介&#xff1a; Spark是一个分布式计算框架&#xff0c;常用于大数据处理。本次实验中&#xff0c;首先设计一个包含主节点和从节点的Spark集群架构&#xff0c;并在CentOS的Linux环境下进行搭建。通过下载并解压Spark安装包&#xff0c;配置环境变量和集群参数&…

【Python Cookbook】S1E09 对切片命名

目录 问题解决方案讨论 问题 代码的可阅读性非常重要&#xff0c;如何增强切片中的可阅读性&#xff1f;本文将提供一种方案。 解决方案 假设有一些代码用来从字符串的固定位置取出具体的数据&#xff1a; record "...100...513.25..." cost int(record[3:6]) …

【显示方案IC-速显微】

最近偶然间接触到“速显微”的显示方案&#xff0c;个人体验了一把感觉还是挺顺手的&#xff0c;虽然手里没有板子没有上手测试一番。 这是他们的官网链接&#xff1a; https://www.thorsianway.com/product/chip 从官网可以看到有两颗个系列的IC已经量产&#xff1a;GC9005和G…

Docker部署pulsar独立集群消息队列服务器

1、下载Pulsar docker 镜像 docker pull apachepulsar/pulsar:latest 2、生成Pulsar容器&#xff0c;把容器的6650和8080端口映射到宿主机的6650和8080端口&#xff0c;standalone参数表示pulsar为独立集群模式&#xff0c;把容器中的conf目录映射到宿主机的/var/lib/docker/…

【QEMU中文文档】1.1 支持的构建平台

本文由 AI 翻译&#xff08;ChatGPT-4&#xff09;完成&#xff0c;并由作者进行人工校对。如有任何问题或建议&#xff0c;欢迎联系我。联系方式&#xff1a;jelin-shoutlook.com。 原文&#xff1a;Supported build platforms — QEMU documentation QEMU 旨在支持在多个主机…

Apache Calcite - 使用内置函数

前言 在上一篇文章中学习了如何适配来源数据&#xff0c;并使用sql查询数据。当我们获取数据后&#xff0c;通常还会进行各种计算、变换工作&#xff0c;这时使用内置函数可以极大提高我们的效率。 函数介绍 Apache Calcite 提供了广泛的 SQL 函数支持&#xff0c;包括但不限…

基础—SQL—DCL(数据控制语言)小结

一、总结 在SQL分类中的DCL语句部分&#xff0c;主要讲到了两个部分的知识。 1、用户管理 用户管理&#xff0c;主要是管理哪些用户可以访问当前 mysql 数据库。 包括&#xff1a;创建用户、修改用户密码以及删除用户 2、权限控制 权限管理&#xff0c;主要是控制我们当前用户…

vue前端Echars

<template><div :class"className" :style"{height:height,width:width}" /> </template><script> import * as echarts from echarts require(echarts/theme/macarons) // echarts theme 柱状图 import resize from ./mixins/re…

代码随想录算法训练营Day24|216.组合总和III、17.电话号码的字母组合

组合总和III 216. 组合总和 III - 力扣&#xff08;LeetCode&#xff09; 思路和昨日的组合题类似&#xff0c;但注意对回溯算法中&#xff0c;收获时的条件需要写对&#xff0c;path的长度要为k的同时&#xff0c;path中元素总和要为n。 class Solution { public:vector<…

禁用USB端口的办法,哪一种禁用USB端口的方法好

禁用USB端口的办法&#xff0c;哪一种禁用USB端口的方法好 禁用USB端口是保护公司数据安全的一种常见做法&#xff0c;旨在防止未经授权的数据传输和潜在的恶意软件传播。以下是几种常见的禁用USB端口方法及其效果评价。 1、硬件方法&#xff1a; BIOS设置&#xff1a;通过BIO…

混合动力电动汽车介绍(一)

电动汽车发展的技术背景主要包含环境问题和能源问题两大方面。环境问题的表现形式为空气污染&#xff0c;而能源问题的表现形式为现有能源供应体系对化石燃料的过分依赖。《新能源汽车产业发展规划&#xff08;2021-2035&#xff09;》中明确我国新能源汽车技术研发的“三纵”、…

探索Python机器学习:从基础到实践

探索Python机器学习&#xff1a;从基础到实践 本文将带您从机器学习的基础知识出发&#xff0c;逐步深入到实际应用&#xff0c;帮助您掌握Python机器学习的核心技能。 一、机器学习概述 1. 什么是机器学习&#xff1f; 机器学习是一种通过分析数据来自动发现模式并做出预测…

软件架构设计属性之5:可维护性属性分析与应用

文章目录 引言一、可维护性定义和重要性1.1 定义1.2 重要性 二、可维护性关键要素2.1 模块化2.2 单一职责2.3 低耦合2.4 高内聚2.5 抽象和封装2.6 实践建议 三、设计原则3.1 开闭原则3.2 依赖倒置原则3.3 评估方法3.4 挑战与解决方案 四、实战应用总结 引言 在当今数字化飞速发…

Java学习路径图

1.学习路径 JAVA架构师学习路径 2.路径拆解 2.1 Spring 2.1.1 SpringBoot原理 SpringBoot2学习视频 SpringBoot2笔记 SpringBoo2代码 2.2.2 SpringBoot项目 《谷粒商城》学习视频

Implicit-SDF-Planner代码详解(2)

Implicit-SDF-Planner代码详解&#xff08;2&#xff09; 第三部分:轨迹优化 在获得了一条初始路径后,下一步就是在此基础上生成一条光滑、安全、动力学可行的轨迹,这就是轨迹优化要解决的问题。 让我们回到plan_manager.cpp,看看PlannerManager的generateTraj函数: void P…

IPv6在军事中的价值

计算机网络作为信息传输的主要通道&#xff0c;将在未来战场上发挥主导作用。当前的网络是基于IPv4协议构建的&#xff0c;然而&#xff0c;IPv4面临着一系列问题&#xff0c;如地址枯竭、路由瓶颈等&#xff0c;这些问题导致网络安全和服务质量难以适应军事网络的高速发展。在…

一文了解JVM面试篇(上)

Java内存区域 1、如何解释 Java 堆空间及 GC? 当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建 堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一 个进程,回收无效对象的内存用于将来的分配。 2、JVM 的主要组成…