• 【Linux】gcc/g++


    目录

    一.概念

    二.语法

    三.动/静态库

    四.关于文件名后缀问题


    一.概念

    gcc/g++是linux系统中的编译器,是一款软件。该软件只负责编译,与Windows下的vs系列的差别就是:vs系列是一种集成开发环境(IDE)而Linux下的gcc/g++,只是用来编译的。gcc与g++的区别只有一点gcc用来编译C语言代码,g++用来编译C++代码,这两个工具在用法上完全类似,所以以下的叙述就用gcc来举例展开说明。

    gcc生成的可执行程序有两个默认行为:

    1.默认链接到动态库2.默认发布为release版本

    二.语法

    gcc [选项] [要编译的文件] [选项] [目标文件]

    例如:从一个test.c文件直接生成可执行程序mytest

            gcc test.c -o mytest 或者 gcc -o mytest test.c

    从一个文件直接生成一个可执行程序需要经过4个步骤,gcc编译器可以将4步拆分开

            -预处理(头文件展开,宏替换,去注释,条件编译)

                    gcc -E test.c -o test.i 

            -编译(代码转汇编)

                    gcc -S test.i -o test.s

            -汇编(汇编转二进制)

                    gcc -e test.s -o test.o

            -链接(将多个目标文件与动/静态库链接生成.exe)

                    gcc test.o -o mytest

    总结:

    -E只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面

    -S 编译到汇编语言不进行汇编和链接

    -c 编译到目标代码

    -o文件输出到文件

     

    三.动/静态库

    动/静态库都统称为函数库。我们知道在C语言中调用printf函数时,是需要包含stdio.h这个头文件的。我现在需要调用printf这个函数,但是我并没有自己写这个函数的实现,而是通过包含头文件,也就是有了这个头文件声明之后,直接就可以使用了。那么这个操作背后的原理就是,例如,在Windows中的vs系列,安装vs时就会把对应的动/静态库安装好了,而Linux下的gcc会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到libc.so.6库函数中去,我们包含的头文件是函数的声明,而函数的实现就在这些库中,编译器编译好代码生成可执行程序,在链接这一步,会自动的帮我们链接到这些库。

    在编译链接时的区别:

    静态库:把代码中所用到的函数实现,全部都拷贝到可执行文件中,Linux下后缀名为.a,Windows下后缀名为.lib

    优点:运行时,不再依靠库,可以独立运行

    缺点:生成的文件比较大

    动态库:不会拷贝到可执行文件中,而是在程序执行时由运行时的链接文件加载库,Linux下后缀名为.so,Windows下后缀名为.dll

    优点:节省系统开销

    缺点:运行时,依赖库,如果库被删或被损毁,则程序无法运行

    gcc编译器默认链接动态库

    那么如何链接到静态库呢?

    答:gcc test.c -o mytest -static

    可以看出链接静态库的可执行程序大小是远远大于链接动态库的!

    四.关于文件名后缀问题

    千万要注意,我们都知道在Linux下,文件类型是不以文件名后缀作区分的。那我们在写程序的时候,文件名是不是就可以随便写了呢?

    最好不要乱写!!C语言代码,后缀就用.c,C++代码,后缀就用.cpp,因为gcc是Linux下的一款软件,这款软件要区分这个文件要链接对应的哪个语言的库,是自动依靠文件名后缀做区分的!

  • 相关阅读:
    AttributeError: module ‘hanlp.utils.rules‘ has no attribute ‘tokenize_english‘
    紫光同创FPGA图像视频采集系统,提供2套PDS工程源码和技术支持
    C++ 大作业/课程设计 小型公司工资管理软件
    【PytorchLearning】Dropout | 内部机制及代码复现
    [附源码]Java计算机毕业设计SSM二手交易平台
    VISUAL SVN 5.6.0以上破解使用天数
    基于BP神经网络预测电力负荷(Matlab代码实现)
    MySQL 官方出品,比 mydumper 更快的多线程逻辑备份工具-MySQL Shell Dump & Load
    【Python零基础入门篇 · 7】:列表、元组的相关操作(完整版)
    心肺运动试验----各类参数分析笔记
  • 原文地址:https://blog.csdn.net/Hello_World_213/article/details/126067893