• 4gcc编译器


    gcc编译器(GNU C Compiler)

    现在我们所说的 gcc 是 GUN Compiler Collection的缩写,可以支持多种语言编译,比如 C,C++,Java, pascal 等

    gcc的主要特征

    1: 可移植编译器,支持多种硬件平台

    2:支持跨平台交叉编译(跨CPU)

    3:多种语言前端,用于解析不同语言

    4:按模块化设计,可以加入新语言和新CPU架构的支持

    5:自由软件

    gcc编译程序过程

    1: 预处理(pre-processing)E

    2: 编译(Compiling)            S

    3: 汇编(Assembling)          c

    4: 链接 (Linking)

    gcc常用选项

    gcc编译过程

    预处理编译:gcc -E main.c -o main.i

    编译成汇编:gcc -S main.i -o main.s

    编译成二进制:gcc -c mian.s -o mian.o

    连接,编译成可执行文件:gcc main.o -o main

    执行:./main

    一步编译:

     gcc main.c -o main

    运行:

    ./main

    此处目标文件可不要扩展名。无意义,可用于识别。

    -Wall 选项

    增加所有编译告警

    举例:

    printf(“Four:%f ”,4)

    定义参数未使用等

    头文件与库文件

    库文件:预先编译好的函数集合,可重用,比如说 ncurse库(处理屏幕显示),dbm库(数据库访问)

    头文件,库文件位置

    -Ixxx  指定头文件目录为xxx

    /usr/include/

    /usr/local/include/

    -Lxxx 指定lib目录为 xxx

    /usr/lib/

    /usr/local/lib/

    使用外部#include<math.h>

    #include<stdio.h>

    int main()

    {

        double x=pow(2.0,3.0);

        printf("Result:%f ",x);

        return 0;

    }

    gcc –Wall calc.c –o calc –lm     (libm 数学函数库, lib省略)库

    静态库与共享库(动态库)

    静态库(.a): 程序在编译链接时候把库的代码链接到可执行文件中。程序运行时候,不再需要静态库

    生成的可执行文件大,每个可执行文件都会加载一份拷贝到内存

    共享库(.so或.sa): 程序运行时候才去链接共享库代码,多个程序共享使用

    使用时候只需要加载一份到内存

    共享库

    共享库链接的可执行文件:包含了一个函数入口地址表

    可执行文件运行时候,操作系统把外部函数从磁盘共享库中复制到内存(也就是动态链接)

    操作系统采用虚拟内存机制,允许物理内存中一份共享库被所有需要的进程公用,节省内存和磁盘空间

    生成静态库

    静态库生成(libxxx.a):

    gcc –c fun.c   

    生成 myslib.o

    ar rcs libfun.a  fun.o

    生成 libMyslib.a

    rcs: replace and create

    静态库使用:

    1: gcc –Wall main.c libfun.a –o main

    2: gcc –Wall –L. main.c –o main –lfun

     -L.表示在当前目录搜索 libfun.a

    生成共享库(libxxx.so)

    gcc –shared –fPIC fun.c –o libFun.so

    shared:生成共享库格式

    fPIC:  产生位置无关码,允许在任何地址加载 (否则只能从指定地址加载,无法控制)相对地址

    使用:

    gcc –Wall main.o –o main –L. -lFun

    头文件搜索路径

    1:编译使用选项 –I 指定的目录

    2:修改环境变量,搜索指定的目录(建议)

    设置环境变量 C_INCLUDE_PATH (gcc)

    设置环境变量 CPLUS_INCLUDE_PATH (g++)

    临时修改: export  C_INCLUDE_PATH =“_目录_”

    永久修改: ~/.profile 文件中,增加一行上述命令

    3:头文件放入系统include目录

    链接库搜索路径

    1:编译使用选项 –L  指定目录

    2:修改环境变量,搜索指定的目录(建议)

    设置环境变量  LIBRARY_PATH

    3:把生成的lib文件放入系统lib目录

    运行库搜索路径

    1:修改环境变量,搜索指定的目录(建议)

    设置环境变量  LD_LIBRARY_PATH

    2: 修改配置 /etc/ld.so.conf

    增加环境变量 LD_LIBRARY_PATH

    修改完成后使用 ldconfig 命令进行刷新

    3:生成的lib文件放入系统lib目录

    ldd命令:

    ldd [exeFile]      查看exeFile调用的动态库  

    注意:

    1. 两个库同时存在,优先使用的是共享库

    2. 使用静态库,编译好可执行文件后,删除静态库,可执行文件无影响,但是共享库不能删除。

  • 相关阅读:
    JQuery中的id选择器含有特殊字符时,不能选中dom元素
    解决Mac下MySQL登录问题
    Mac 安装mysql
    禁止chrome浏览器自动填充表单的解决方案
    Eclipse 编译错误 Access restriction: The type 'JPEGCodec' is not API (restriction on required library 'C:Program FilesJavajre7lib t.jar')
    羊皮纸月亮计划
    ActionSupport.getText()方法
    linux入门经验之谈
    tomcat设置默认启动项
    网页设置下载apk
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/9215938.html
Copyright © 2020-2023  润新知