• 【linux】编译器使用


    目录

    1. gcc ,g++ 编译器使用

    a. 有关gcc的指令(g++同理)

    2. .o 文件和库的链接方式

    a. 链接方式

    b. 动态库 和 静态库 优缺点对比

    c. debug 版本 和 release 版本



    1. gcc ,g++ 编译器使用

    a. 有关gcc的指令(g++同理)

    注意:

    linux下自带gcc编译器,如果要安装g++编译器;

    • sudo yum install -y gcc-g++ (普通用户)

    • gcc + 文件名

    得到可执行文件

    • gcc + 文件名 + -o + 自定义文件名

    得到的可执行文件可以自己命名

    • gcc + E + 文件名 + -o + 自定义文件名 (一般以 .i 结尾)

    得到预处理后的文件可以自己命名

    注意:

    -E 告诉编译器,从现在阶段开始执行完预处理阶段就可以停下来了

    • gcc -S + 文件名 + -o + 自定义文件名 (一般以 .s 结尾)

    得到编译后的文件可以自己命名

    注意:

    -S 告诉编译器,从现在阶段开始执行完编译阶段就可以停下来了(得到的是汇编代码

    • gcc -c + 文件名 + -o + 自定义文件名 (一般以 .o 结尾)

    得到汇编后的文件可以自己命名(得到的是二进制代码

    注意:

    1. 得到的文件(可重定位目标二进制文件)不可以直接执行(缺少链接这一步
    2. 链接链接的是库文件 (Linux下:.so(动态库) .a(静态库),windows下:.dll(动态库),.lib(静态库))
    3. linux系统下,库有自己的命名规则:libname.so (红色标明的位置才是库的名字)
    4. 编译型语言,所谓的安装包,是安装了 头文件 + 库文件
    5. linux系统下,默认只安装了动态库,没有安装静态库
    6. 函数的实现就是调用了库文件,库文件就是源文件(.c)经过一定翻译后,形成的一个文件(可以打包多个源文件,也可以达到隐藏源文件的效果
    7. 头文件提供方法的声明,库文件提供方法的实现
    8. 头文件所处位置:/usr/include

    2. .o 文件和库的链接方式

    a. 链接方式

    1. 动态链接

    动态库不能缺失,一旦对应的动态库缺失,影响的不止一个程序

    1. 静态链接

    在编译器使用的时候,静态链接时,会将自己的函数拷贝到目标文件中,如果静态库缺失了,不会影响目标程序

    注意:

    1. 在 Linux系统下,默认采用的链接是动态链接(需要提供动态库
    2. 动态库只能使用动态链接,静态库只能使用静态链接
    1. -static 选项

    采用静态链接(需要提供静态库

    注意:

    1. 安装 C语言 静态库(普通用户):
    • sudo yum install -y glibc-static

    1. 安装 C++ 静态库(普通用户)
    • sudo yum install -y libstdc++-static

    1. 如果只有动态库,没有静态库,-static 是不行的
    2. 如果没有动态库,只有静态库,那么只能用静态库 (本来编译器默认优先使用动态库,-static 是改变优先级,将所有的链接要求都改成静态链接,没有就会报错 )

    b. 动态库 和 静态库 优缺点对比

    1. 动态库因为是共享库,可以节约资源(磁盘资源,内存资源,网络资源等)【优点】
    2. 动态库一旦缺失,目标程序很可能不能执行 【缺点】
    3. 静态库依赖小,缺失静态库不会对目标程序造成什么影响 【优点】
    4. 静态库体积大,资源消耗大 【缺点】

    c. debug 版本 和 release 版本

    注意:

    1. gcc 默认形成的可执行程序是以 release 版本发布出去的
    2. debug 版本 会比 release 版本 多加 debug 信息 ,所以体积上也会更大

    • gcc + 文件名 + -o + 目标文件名 + -g

    形成的可执行文件是 debug版本 的

  • 相关阅读:
    2023年软件测试常见面试题
    【k8s】2、二进制安装k8s
    Vue简介,模板语法,mvvm模型
    win10重命名文件夹找不到指定文件
    java计算机毕业设计居家养老系统MyBatis+系统+LW文档+源码+调试部署
    JS 采用JSON.parse实现深拷贝时出现的问题?
    leetcode-775:全局倒置与局部倒置
    ZOOM 2023校招笔试第二题
    make.exe打印出一个变量和修改追加变量的方法
    JMeter集结点的使用场景以及如何使用?
  • 原文地址:https://blog.csdn.net/2301_79789645/article/details/138168916