0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

盘点一下gcc有哪些常用选项

学益得智能硬件 来源:学益得智能硬件 2023-05-09 17:17 次阅读

gcc有哪些常用选项,今天,就来给大家盘点一下。

-E表示预处理,处理所有以井号键开头的代码,常见的比如把头文件展开。

hello.c

#include 


int main()
{
    printf("helloworld
");


    return 0;
}
预处理:
gcc -E hello.c -o hello.i
预处理后的文件:
# 1 "hello.c"
# 1 ""
# 1 ""
# 31 ""
# 1 "/usr/include/stdc-predef.h" 1 3 4 
# 32 "" 2
# 1 "hello.c"
# 1 "/usr/include/stdio.h" 1 3 4 
# 27 "/usr/include/stdio.h" 3 4 
# 1 "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h" 1 3 4 
# 33 "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h" 3 4 
# 1 "/usr/include/features.h" 1 3 4 
# 461 "/usr/include/features.h" 3 4 
# 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4 
# 452 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 4 
# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4 
# 453 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4 
# 1 "/usr/include/x86_64-linux-gnu/bits/long-double.h" 1 3 4
# 454 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4
# 462 "/usr/include/features.h" 2 3 4
# 485 "/usr/include/features.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 1 3 4
# 10 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/gnu/stubs-64.h" 1 3 4
# 11 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 2 3 4
# 486 "/usr/include/features.h" 2 3 4
# 34 "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h" 2 3 4
# 28 "/usr/include/stdio.h" 2 3 4


# 1 "hello.c"
# 1 ""
# 1 ""
# 31 ""
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "" 2
# 1 "hello.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 27 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h" 1 3 4
# 33 "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 461 "/usr/include/features.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4
# 452 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
# 453 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4
.....
-S表示编译,把C文件变成汇编文件。

还是使用hello.c源文件。
gcc -S hello.c -o hello.s
汇编后的文件变成:
    .file   "hello.c"
    .text
    .section    .rodata
.LC0:
    .string "helloworld"
    .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
    ......
-c表示汇编,把汇编文件变成二进制文件,但是这个二进制文件还不能运行,因为缺少库的信息

还是使用hello.c源文件:
gcc -c hello.c -o hello.o
汇编后的文件是二进制文件,用vim打开后是这样:

e3475c2a-ee48-11ed-90ce-dac502259ad0.png  

-l表示链接库的名字,比如我们经常用的多线程,编译的时候加上加上-lpthread 编译器会自动去找 libpthread.so,如果代码里面用到第三方库,一般都要加上。

thread.c
#include 
#include 
#include 


void *my_thread(void *arg)
{
    printf("this is my thread ...
");
}


int main()
{
    pthread_t tid;


    if (pthread_create(&tid, NULL, my_thread, NULL) != 0)
    {   
        perror("pthread_create");
        exit(1);
    }


    void *status;
    pthread_join(tid, &status);


    return 0;
}
编译:
gcc thread.c -o thread -lpthread
-L表示库的路径。如果是你自己制作的库文件,并且没有放在系统指定的目录下,比如 /lib,那编译的时候就要加上库的路径,否则,编译器找不到库在哪。

假设有个动态库叫做 libtest.so,存放在当前目录下:
root@Turbo:test# ls
hello.c  libtest.so

如果编译的时候需要链接 libtest.so,则:

gcc main.c -o main -ltest -L .
-I表示头文件路径,常用于自己写的头文件,不在当前目录下,那编译的时候就得指定头文件的路径。

假设 hello.c 源文件包含了 hello.h 头文件:
#include"hello.h"
hello.h存放在上一级目录:
root@Turbo:test# ls
hello.c
root@Turbo:test# ls ..
hello.h  test
编译的时候,需要指定头文件的路径:
gcc hello.c -o hello -I ..
-g表示可以调试,比如我们之前讲的gdb、valgrind,如果想要调试的时候显示源码、行号,编译的时候就需要加上-g选项。
gcc hello.c -o hello -g
-O表示优化,可以是O0到O3,我们之前讲volatile的时候,就用过这个选项,不同的优化等级,对代码的处理略微有些区别。

hello.c
#include 
#include 


void delay()
{
    int i, j;
    for (i = 0; i < 100000; i++)
    {   
        for (j = 0; j < 10000; j++);
    }   
}


int main()
{
    printf("%ld
", time(NULL));


    delay();


    printf("%ld
", time(NULL));


    return 0;
}

不优化:
gcc hello.c -o hello
运行结果:
root@Turbo:test# ./hello 
1683603927
1683603929
root@Turbo:test#
优化:
gcc hello.c -o hello -O3
运行结果:
root@Turbo:test# ./hello 
1683603941
1683603941
root@Turbo:test#
当然,还有 -o,表示输出的意思,用来指定编译后生成文件的名字。
gcchello.c-o hello
-Wall表示打开所有警告,有时候编译器会认为一些不规范的写法影响不大,并不会提示出来,加上Wall,会把这些不重要的警告也打印出来。

hello.c
#include 


int main()
{
    int i;


    return 0;
}
不打开警告编译:
root@Turbo:test# gcc hello.c -o hello
root@Turbo:test#
打开警告编译:
root@Turbo:test# gcc hello.c -o hello -Wall
hello.c: In function ‘main’:
hello.c:5:6: warning: unused variable ‘i’ [-Wunused-variable]
    5 |  int i;
      |      ^
root@Turbo:test#
-D表示添加宏定义,调试代码的时候非常有用,可以避免每次都要修改代码。

hello.c
#include 


int main()
{
#ifdef HELLO
    printf("helloworld
");
#endif


    return 0;
}
编译不提供宏定义:
gcc hello.c -o hello
运行结果:
root@Turbo:test# ./hello 
root@Turbo:test#
编译提供宏定义:
root@Turbo:test# gcc hello.c -o hello -DHELLO
root@Turbo:test#
运行结果:
root@Turbo:test# ./hello 
helloworld






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 二进制
    +关注

    关注

    2

    文章

    772

    浏览量

    41553
  • GCC
    GCC
    +关注

    关注

    0

    文章

    105

    浏览量

    24802
  • VIM
    VIM
    +关注

    关注

    0

    文章

    134

    浏览量

    15261

原文标题:gcc常用选项盘点

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux GCC的编译

    、Linux 多文件编译 在上篇 Linux 的 C 编程我们知道了 Linux 的编译器为
    的头像 发表于 09-11 15:18 2354次阅读
    Linux <b class='flag-5'>下</b><b class='flag-5'>GCC</b>的编译

    常用编辑器之GCC编译器

    :~$ sudo apt install gcc2、GCC的编译选项GCC的基本用法是:gcc [选项
    发表于 08-24 11:05

    不常见但是很有用的 gcc 命令行选项

    些特殊的警告吗?gcc 的很多命令行选项都不会经常用到,但是它们在某些特定的情况会变得非常有用,例如,当你在调试代码的时候。所以在本文中
    发表于 12-31 11:08

    gcc和Linux gcc常用选项

    gcc的使用方法gcc选项】文件名gcc常用选项gcc
    发表于 10-19 22:43

    常见gcc编译警告整理以及解决方法

     GCC很多的编译选项,警告选项;指定头文件、库路径;优化选项。本文针整理一下
    发表于 11-14 11:19 2.1w次阅读

    嵌入式Linux工具之GCC常用编译选项

    “-I dir”选项可以在头文件的搜索路径列表中添加 dir 目录。由于 Linux 中头文件都默认放到了“/usr/include/”目录下,因此,当用户希望添加放置在其他位置的头文件时,就可以通过“-I dir”选项来指定,这样,g
    的头像 发表于 03-22 11:16 7676次阅读
    嵌入式Linux工具之<b class='flag-5'>GCC</b><b class='flag-5'>常用</b>编译<b class='flag-5'>选项</b>

    盘点一下哪些手机支持5G网络呢

    随着5G网络的推广,各大厂商也开始陆续推出支持5G网络的手机。今天为大家盘点一下,究竟哪些手机支持5G网络呢。
    的头像 发表于 08-22 11:54 1.6w次阅读

    Linux和UNIX的GCC命令大全

    GCC 超过 100 个的编译选项可用。 这些选项中的许多你可能永远都不会用到, 但些主要的选项
    发表于 11-01 08:00 0次下载
    Linux和UNIX的<b class='flag-5'>GCC</b>命令大全

    Linux系统Gcc的基本用法和选项

    在使用Gcc编译器的时候,我们必须给出系列必要的调用参数和文件名称。Gcc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数
    发表于 08-20 09:57 1253次阅读

    gcc的使用方法以及Linux gcc常用选项

    gcc的使用方法 gcc选项】文件名 gcc常用选项 g
    的头像 发表于 10-22 14:42 3027次阅读

    gcc的编译选项总结

    本文用于记录我在学习和工作中遇到的各种GCC选项,虽然这些选项可以在GNU的手册上查到,不过这里做个总结,可以避免每次都去查手册,算是个备忘吧。本文的内容会不断更新扩充。
    的头像 发表于 11-02 09:37 1492次阅读

    tcpdump常用选项参数详细总结

    常用选项通过上述的实战案例,相信大家已经掌握的 tcpdump 基本用法,在这里来详细总结一下常用选项参数。 (
    的头像 发表于 09-28 15:52 1686次阅读

    认识一下几个常用的门级电路

    标准单元库是数字集成电路的积木,是复杂电路和系统的基础。今天我们来认识一下其中的几个常用门级电路。
    的头像 发表于 10-09 15:49 1357次阅读
    认识<b class='flag-5'>一下</b>几个<b class='flag-5'>常用</b>的门级电路

    盘点一下CST电磁仿真软件的求解器

    今天我们起来盘点一下CST电磁仿真软件那些牛叉的求解器。快来数一下,你用了里面的几种吧!
    的头像 发表于 11-20 10:18 5860次阅读
    <b class='flag-5'>盘点</b><b class='flag-5'>一下</b>CST电磁仿真软件的求解器

    盘点一下高通CES 2024汽车创新技术

    在CES2024上,我们看到英特尔和AMD加入,加上原来的英伟达,高通需要和这些跨行的对手在个赛道卷,目前高通在数字座舱、云连接、人工智能和自动驾驶领域是定的积累的,我们来盘点
    的头像 发表于 01-13 15:22 1731次阅读
    <b class='flag-5'>盘点</b><b class='flag-5'>一下</b>高通CES 2024汽车创新技术