g++命令

devtools/2024/10/19 5:28:23/


本文部分翻译自https://www.man7.org/linux/man-pages/man1/g++.1.html,过程中借助AI工具进行翻译,并进行微调。

一、名称
gcc c和c++编译器
二、概要
       gcc [-c|-S|-E] [-std=standard]
           [-g] [-pg] [-Olevel]
           [-Wwarn...] [-Wpedantic]
           [-Idir...] [-Ldir...]
           [-Dmacro[=defn]...] [-Umacro]
           [-foption...] [-mmachine-option...]
           [-o outfile] [@file] infile...

        g++和gcc绝大部分选项是一致的。

三、常用选项

-E
在预处理之后停止;不执行编译。输出形式为预处理后的源代码,该代码被发送到标准输出。
不需要预处理的输入文件将被忽略。

示例:
$ g++ -E main.cpp -I ./lib

输出:

# 0 "main.cpp"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 0 "<command-line>" 2
# 1 "main.cpp"

# 1 "./lib/add.h" 1

int g_value;
int Add(int a, int b);
# 3 "main.cpp" 2

int main(){

  int a = 10, b = 11;
  int sum = Add(a, b);

  return 0;
}

-S
在编译之后停止;不进行汇编。输出形式为汇编代码文件。
默认情况下,源文件的汇编文件名是通过将后缀 .c、.i 等替换为 .s 来生成的。
不需要编译的输入文件将被忽略。

源代码--编译-->汇编代码

示例:
$ g++ -E main.cpp -I ./lib

查看:
$ cat main.s

输出结果:

    .file    "main.cpp"
    .text
    .globl    g_value
    .bss
    .align 4
    .type    g_value, @object
    .size    g_value, 4
g_value:
    .zero    4
    .text
    .globl    main
    .type    main, @function
main:
.LFB0:
    .cfi_startproc
    endbr64
    pushq    %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    $16, %rsp
    movl    $10, -12(%rbp)
    movl    $11, -8(%rbp)
    movl    -8(%rbp), %edx
    movl    -12(%rbp), %eax
    movl    %edx, %esi
    movl    %eax, %edi
    call    _Z3Addii@PLT
    movl    %eax, -4(%rbp)
    movl    $0, %eax
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size    main, .-main
    .ident    "GCC: (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0"
    .section    .note.GNU-stack,"",@progbits
    .section    .note.gnu.property,"a"
    .align 8
    .long    1f - 0f
    .long    4f - 1f
    .long    5
0:
    .string    "GNU"
1:
    .align 8
    .long    0xc0000002
    .long    3f - 2f
2:
    .long    0x3
3:
    .align 8
4:

main.s是汇编代码

-c
编译或汇编源文件,但不进行链接。链接不会执行。最终输出是每个源文件的一个目标文件。
默认情况下,源文件的目标文件名是通过将后缀 .c、.i、.s 等替换为 .o 来生成的。
不要求编译或汇编的、无法识别的输入文件将被忽略。

汇编代码--汇编-->二进制代码

示例:
编译main.cpp
$ g++ -c main.cpp -I ./lib

使用objdump命令查看目标文件
$ objdump -DS main.o 

输出(部分):
main.o:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 <main>:
   0:    f3 0f 1e fa              endbr64 
   4:    55                       push   %rbp
   5:    48 89 e5                 mov    %rsp,%rbp
   8:    48 83 ec 10              sub    $0x10,%rsp
   c:    c7 45 f4 0a 00 00 00     movl   $0xa,-0xc(%rbp)
  13:    c7 45 f8 0b 00 00 00     movl   $0xb,-0x8(%rbp)
  1a:    8b 55 f8                 mov    -0x8(%rbp),%edx
  1d:    8b 45 f4                 mov    -0xc(%rbp),%eax
  20:    89 d6                    mov    %edx,%esi
  22:    89 c7                    mov    %eax,%edi
  24:    e8 00 00 00 00           call   29 <main+0x29>
  29:    89 45 fc                 mov    %eax,-0x4(%rbp)
  2c:    b8 00 00 00 00           mov    $0x0,%eax
  31:    c9                       leave  
  32:    c3                       ret    

Disassembly of section .bss:

0000000000000000 <g_value>:
   0:    00 00                    add    %al,(%rax)

可以看到,编译后目标文件已经是二进制代码。

-o file
指定输出文件名称

-std=
指定语言标准,目前只支持c和c++

示例:
$ g++ -std=c++11 main.cpp -I ./lib

-shared
生成一个动态库,然后可以与其他对象链接以形成可执行文件。并非所有系统都支持此选项。为了得到可预测的结果,您在指定此链接器选项时,也必须指定用于编译的同一组选项(-fpic、-fPIC 或 model 子选项)。

-g
生成调试信息,debug模式下用于调试代码

-pthread
链接到POSIX线程库

-I dir
添加搜索头文件目录

-Ldir
添加库文件搜索目录

-fpic
生成适用于共享库的与地址无关的代码(PIC)(如果机器支持的话)

-fPIC
生成与位置无关的的代码,适用于使用动态库,与“-fpic”的区别在于去除去全局偏移表的任何限制(如果机器支持的话)
 


http://www.ppmy.cn/devtools/28337.html

相关文章

GD32E103C8T6 封装LQFP-48 GigaDevice(兆易创新) 单片机

GD32E103C8T6 是由GigaDevice&#xff08;兆易创新&#xff09;公司生产的一款基于ARM Cortex-M4内核的32位MCU&#xff08;微控制器&#xff09;。以下是GD32E103C8T6的一些主要功能和参数介绍&#xff1a; 主要功能&#xff1a; 高性能ARM Cortex-M4内核: 采用120MHz的ARM …

Devops部署maven项目

这里讲下应用k8s集群devops持续集成部署maven项目的流程。 failed to verify certificate: x509: certificate signed by unknown authority 今天在执行kubectl get nodes的时候报的证书验证问题&#xff0c;看了一圈首次搭建k8s的都是高频出现的问题。 couldn’t get curren…

骑缝电子章怎么盖?

盖骑缝电子章通常涉及几个基本步骤&#xff0c;这里提供一个通用的流程&#xff0c;适用于大多数电子文档处理软件&#xff0c;尤其是那些支持电子签名和印章功能的软件&#xff0c;比如Adobe Acrobat Pro DC、e-章宝(易友EU3000智能盖章软件)等。请注意&#xff0c;具体操作可…

WSL2-Ubuntu使用Conda配置百度飞浆paddlepaddle虚拟环境

0x00 缘起 本文将介绍在WSL2-Ubuntu系统中,使用Conda配置百度飞浆paddlepaddle虚拟环境中所出现的各种问题以及解决方法,最终运行"run_check()"通过测试。 在WSL2中配置paddlepaddle不像配置Pytorch那样顺滑,会出现各种问题(如:库的文件缺失、不知道如何匹配C…

pytorch运行物体检测模型 SSD

物体检测是指根据一张图片包含的多个物体&#xff0c;通过模型分析物体的信息&#xff0c;最终给出图片中物体的位置以及物体的分类名称。物体检测输入的是一张图片&#xff0c;图片上包含多个物体&#xff0c;输出包括 图片中物体的位置和大小的相关信息物体的分类标签名称检…

Esko Ukkonen: On-line Construction of Suffix Trees

Esko Ukkonen: On-line Construction of Suffix Trees 文章目录 Esko Ukkonen: On-line Construction of Suffix Trees一、后缀树的概念及应用【详见刘方州同学报告】1.1 字典树 Trie1.2 后缀树 Suffix Tree2 后缀树的应用 二、朴素后缀树构造方法及问题三、线性时间内后缀树在…

HarmonyOS开发案例:【排行榜页面】

介绍 本课程使用声明式语法和组件化基础知识&#xff0c;搭建一个可刷新的排行榜页面。在排行榜页面中&#xff0c;使用循环渲染控制语法来实现列表数据渲染&#xff0c;使用Builder创建排行列表布局内容&#xff0c;使用装饰器State、Prop、Link来管理组件状态。最后我们点击…

JAVA学习

Java基础语法 Java入门 Java是什么&#xff1a;计算机语言 Java程序初体验 下载和安装 下载JDK:Oracle | Cloud Applications and Cloud Platform 下载jdk17 安装&#xff1a;路径不要包含中文和空格 JDK安装目录&#xff1a; bin:存放各种工具命令 &#xff0c;比较重要…