[转] GCC最常用的标记(一个迷你Makefile配置)

标题:Gcc 最常用的标志

来源网址:https://dvergeylen.github.io/gcc-most-common-used-flags

发布时间:2020-11-19T10:30:00+00:00

Markdown 内容:

介绍

从命令行使用 gccclang 进行编译一开始可能会让人感到害怕,但掌握一些技巧后,它们会变得非常有用且令人兴奋。

在这篇博客文章/参考页面中,我将描述我认为的最佳实践,至少是我在 C/C++ 项目中使用的一些技巧,这些技巧为我节省了数小时的头痛时间。

只要有时间,我会定期更新这篇文章,以涵盖使用 gcc / clang 编译时所需的材料,使您充满信心。

Gcc vs clang vs …?

我听过很多次这个问题。哪个更好/更快/更强?这是一个错误的问题!如果你试图将它们对立起来,你就错了!🙅

它们有时表现更好,有时表现更差。其他编译器也是如此。我不是在谈论它们生成的二进制文件(尽管观察到来自多个编译器的二进制文件之间的显著性能或大小差异可能会突出一些代码弱点或至少一些奇怪之处,因为这意味着它们并没有以相同的方式解释你的代码→很可能是代码味道 🧦),而是关于它们可以提供的(调试)信息。

我使用的最佳实践是,我用它们来编译我的代码(显然不是同时)。当面对你不完全理解的编译错误时,这特别有用,因为一个有时可以输出比另一个更清晰的错误,反之亦然。它们各自的静态分析器(从 GCC 10+ 开始)将帮助你找到这些错误,并告诉你为什么这是非法代码。这显然并不意味着你的代码在没有警告/错误的情况下编译后就能正常工作,但至少是一个好的开始!

不要将编译器对立起来,接受它们的不同。让你的代码在许多编译器上编译是一个非常好的信号,表明你的代码是可移植的并且符合标准。

最常用的 gcc 标志

你可以通过 sudo apt install gcc-doc 安装 gcc 手册页。

GCC 编译标志按用途分组在 man gcc 中。在所有类别中,第一个要考虑的是:警告选项

它列出了控制编译警告的标志。有很多标志,你不需要全部知道。有些非常具体,只在你(交叉)编译到一些不常见的架构或处理一些硬件时有用,如果没有正确配置,这些硬件的行为可能会混淆编译器。

以下是一些非常有用的警告,当一起使用时,涵盖了大多数用例:

  • -Wall 显示所有警告。它不会像名字所暗示的那样激活所有警告,但已经包含了很多;
  • -Wextra 激活一些额外的警告;
  • -Werror 将警告视为错误。你需要这个。我总是认为_“编译时的警告是运行时的错误”_。相信我,它会为你节省一些时间!
  • -Wfatal-errors 在遇到第一个错误时停止。不要让 g++ 变得_那么_冗长 🙉;
  • -Wpedantic 发出严格的 ISO C 和 ISO C++ 要求的所有警告;拒绝所有使用禁止扩展的程序,以及一些不符合 ISO C 和 ISO C++ 的程序。
  • -pedantic-errors 只要基本标准要求诊断,就给出错误。

🧐 始终将 -Wpedantic-pedantic-errors 视为调试标志。
永远不要在生产代码中使用 -Wpedantic,因为输出的警告可能会因标准而异。简单地升级你的编译器版本可能会使其将更新的标准视为新的默认标准,并且可能会出现一些新的严格警告/错误,阻止你的代码编译。突然间,你的客户开始对你大喊大叫,因为她无法再编译你的代码,而你的代码没有任何变化!小心 🛡️!

除了警告选项类别的标志外,你还可能需要另外三个标志来使你的代码在现实世界中编译:-I-L-l。这三个标志分别告诉编译器在哪里查找头文件(描述库的 API)、库的位置以及要链接哪些库。

正如 man gcc 中所述,写 -l 的位置很重要:

链接器按指定的顺序搜索和处理库和目标文件。因此,foo.o -lz bar.o 在文件 foo.o 之后但在 bar.o 之前搜索库 z。如果 bar.o 引用了 z 中的函数,这些函数可能不会被加载。

一个典型的 gcc 命令行将是:

gcc -Wall -Werror ... -Ipath/to/header/files -Lpath/to/library/locations -lmylib

你可以多次使用 -I-L-l 标志。

🧐 我应该修复第三方库的警告吗?
使用 -Werror 编译时使用第三方库可能会很麻烦。这些库可能会生成一些警告,你的代码将无法编译。尽管你可以提交 Pull Requests 来修复它们(如果相关的话),你也可能会认为生活就是这样,你对此无能为力。最简单的解决方案是使用 -isystem 而不是 -I 将它们包含为系统库。GCC 会知道你无法对这些源代码做任何事情,不会再打扰你。很整洁!

pkg-config 来救援

在多个平台/操作系统上编译时,知道头文件/库文件的位置可能很困难。pkg-config 可以通过输出配置了正确位置的编译器标志来帮助你。例如:

# 库 cURL,名为 libcurl
pkg-config --libs --cflags libcurl
# 将输出:
-I/usr/include/x86_64-linux-gnu -lcurl

在编写 Makefile 时非常方便(见下文)!

参考 Makefile

以下是一个最小的参考 Makefile。假设 libcurl 是我们需要链接的依赖项。

在同一目录下输入 make 来构建你的程序。

EXEC=my_output
CC=g++
DEBUGFLAGS=-g -Wpedantic -pedantic-errors
CPPFLAGS=-Wall -Werror -Wextra -Wfatal-errors
IFLAGS=$(shell pkg-config --cflags libcurl)
LFLAGS=$(shell pkg-config --libs libcurl)all: $(EXEC)$(EXEC):$(CC) $(DEBUGFLAGS) $(CPPFLAGS) $(IFLAGS) $(LFLAGS) main.cpp -o $(EXEC)clean:rm -f *.o $(EXEC)
  • EXEC 是可执行文件的名称(最终输出);
  • CC 是你使用的 C(++) 编译器。g++gcc 的一部分;
  • DEBUGFLAGS 是调试标志。-g 使编译器在二进制文件中输出符号,允许调试器运行它并设置断点。严格标志在此列为调试标志,如上所述;
  • CPPFLAGS 是编译标志;
    • 你可能想通过 -std=c2x 添加你的代码所写的标准。
  • IFLAGS:预处理期间要搜索头文件的目录列表。包含一个或多个 -I 标志,后跟相对或绝对路径。
  • LFLAGS:要链接的库列表。

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

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

相关文章

我家一次用电超负荷时20A保险丝断了,但16A的空气开关却没有跳闸.

回答一: 转载自:https://zhidao.baidu.com/question/1970736314255432140.html这说明两者的保护时限不同。无论是保险丝还是空气开关,并不电流达到就立即跳,而且有一定的时间延时来积累热量,热量到了才会动作。 16A的空气开关没跳说明电流虽然超过20A,但时间很快,保险丝…

Easysearch Java SDK 2.0.x 使用指南(二)

在 上一篇文章 中,我们介绍了 Easysearch Java SDK 2.0.x 的基本使用和批量操作。本文将深入探讨索引管理相关的功能,包括索引的创建、删除、开关、刷新、滚动等操作,以及新版 SDK 提供的同步和异步两种调用方式。 SDK 的对象构建有两种方式 1. 传统的 Builder 方式 最基础的…

《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结

《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结@目录二、高级篇(大厂进阶)2.DockerFile解析2.1 是什么2.2 DockerFile构建过程解析2.3 DockerFile常用保留字指令2.4案例2.4.1自定义镜像mycento…

按钮修改状态

首先创造函数void updateBaoxiaoSchedule( int id, String schedule, String schedulereason); 及其实现。 SQL语句: @Update("update submit set state=#{state},statereason=#{statereason} where id=#{id} ") void updateSubmit1( @Param("id") int id…

泰山派设备控制(RGB)

泰山派设备系统控制(RGB) 1、进入设备系统 cd /sys/class2、进入RGB灯子系统 cd /sys/class/leds/罗列可操作的设备,可以看到三个设备,“rgb-led-b”,“rgb-led-g”,“rgb-led-r”,分别对应RGB的蓝,绿,红。3、我们对其单一色灯进行操作 cd rgb-led-b4、ls罗列出可操作的…

《计算机组成及汇编语言原理》阅读笔记:p48-p81

《计算机组成及汇编语言原理》学习第 4 天,p48-p81 总结,总计 34 页。 一、技术总结 1.CISC vs RISC p49, complex instruction set computing For example, a complex instruction set computing (CISC) chip may be able to move a large block of data, perhaps a strin…

在VS2022中,“根据模型生成数据库”时报错:已添加了具有相同键的项(或:An item with the same key has already been added)

解决方法:关闭解决方案,打开解决方案所在文件夹,打开以下文件夹:.vs\ConsoleApp7\FileContentIndex,然后删除里面的所有文件,再重新在VS中打开解决方案重新生成即可

超级AI图像放大工具Upscayl:让你的照片细节更清晰,色彩更鲜艳!

前言 Hello大家好,我又来推荐非常好用的AI图片无损放大器,模糊图片秒变高清,Upscayl是一个免费开源的AI图像超分辨率工具。它使用AI模型来通过猜测细节的方式增强图像并提高其分辨率。该工具适用于Linux、macOS和Windows操作系统 安装环境 [名称]:Upscayl [大小]:400.99MB …

全民点评 测试用例Xmind

项目简介:该项目是一款基于用户点评和校园商户信息为主的生活服务平台。项目利用 Redis 的特性解决不同业务场景中的问题,核心工作包括设计实现缓存更新策略,解决缓存相关问题、订单超卖的线程安全问题。 技术架构:SpringBoot + Mybatis - Plus + MySQL + Redis 功能测试:…

NginxUI:界面化管理Nginx的工具

一、NginxUI简介 1.1 NginxUI介绍 Nginx UI 是一个全新的 Nginx 网络管理界面,旨在简化 Nginx 服务器的管理和配置。它提供实时服务器统计数据、ChatGPT 助手、一键部署、Lets Encrypt 证书的自动续签以及用户友好的网站配置编辑工具。 此外,Nginx UI 还提供了在线访问 Nginx…

Codeforces 1842I. Tenzing and Necklace

神仙题。本题解参考官方题解进行编写,并补充了最后比较关键的怎么调整 \(m\)。 题目链接:I - Tenzing and Necklace 题目大意:给定一个环,环上有 \(n\) 个点与 \(n\) 条边,第 \(i\) 条边连接 \(i\) 与 \(i\bmod n +1\),边权为 \(a_i\)。要求断开若干边使得环断为若干段,…

Docker-compose 实战

以下是一个使用 Docker-compose 启动 Flask 应用的示例: 项目结构:app/|-- app.py|-- requirements.txt|-- Dockerfile|-- docker-compose.ymlapp.py 文件内容: from flask import Flaskapp = Flask(__name__)@app.route(/) def hello_world():return Hello from Flask in D…