1、gcc编译器

  (1)简介

    前期的GCC是GNU C Compiler,仅仅用于C语言的编译,经过多年的发展,现在的GCC为GNU Compiler Collection,并且目前支持多种编程语言的编译。

  (2)gcc的编译过程

    gcc的编译过程包括了四个过程,分别是预处理、编译、汇编和链接,如下所示:

    1)预处理

      主要是完成头文件的展开,c文件中宏的替换展开,去掉有关的注释。

      命令:gcc -E myapp.c -o myapp.i

        -E:生成预处理的文件

        -o:生成目标文件

    2)编译

      预处理后的文件仍然是c文件,编译的过程是把c文件编译成汇编文件。

      命令:gcc -S myapp.i -o myapp.s

        -S:生成汇编文件

    3)汇编

      将汇编文件变成二进制文件。

      命令:gcc  -c myapp.s -o myapp.o

        -c:编译子程序

    4)链接

      将相关的函数库链接到目标文件中去,最终生成可执行文件。

      命令:gcc myapp.o -o myapp

  (3)其它命令参数

    1)查看gcc版本号:-v / --version

    2)指定头文件目录:-I + 目录

    3)编译时定义宏:-D

    4)编译优化:-On (n=0-3:当n为0不优化,当n为3优化级别最高)

    5)提示更多的警告信息:-Wall

    6)包含调试信息:-g (GDB调试需要加此参数)

2、静态库

  (1)命名规则

    1)lib + 库的名字 + .a

    2)例如:libmytest.a(库的名字为mytest)

  (2)制作步骤

    1)生成对应的.o文件,编译时添加-c参数

      命令:gcc mytest.c -c

    2)将生成的.o文件打包

      命令:ar rcs + 静态库的名字(libmytest.a)+ 生成的所有.o文件

  (3)发布和使用静态库

    1)将打包好的lib和头文件发布出去,头文件提供API接口的相关信息

    2)静态库使用方法

      命令1:gcc main.c -I + 头文件路径lib/libmytest.a -o myapp

      命令2:gcc main.c -I + 头文件 -L + 库的路径 -l + 库的名字 -o myapp

  (4)优缺点

    优点:

      1)发布程序的时候,不需要提供相应的库

      2)加载库的速度快

    缺点:

      1)库被打包到应用程序中,导致应用程序的体积很大

      2)一旦库发生了变化,则应用程序需要重新编译

3、共享库(动态库)

  (1)命名规则

    1)lib + 库的名字 + .so

    2)例如:libmytest.so

  (2)制作步骤

    1)生成与位置无关的代码(生成与位置无关的.o文件)

      命令:gcc -fPIC -c *.c -I + 头文件路径

    2)将.o打包成共享库(动态库)

      命令:gcc -shared -o libmyapp.so *.o -I 头文件路径

  (3)发布和使用共享库

    发布:将.so文件和头文件进行发布

    使用:

      命令1:gcc main.c lib/libmyapp.so -o myapp -I 头文件路径

      命令2:gcc main.c -I + 头文件路径 -L + 库的路径文件 -l + 库的名字 -o myapp

  (4)程序执行时动态库无法被加载的问题解决

    原因:环境变量中找不到动态库的路径,程序运行时链接不成功

    解决:

      1)将动态库拷贝到路径/lib中去(不允许使用)

      2)将动态库路径添加到额外的链接环境变量LD_LIBRARY_PATH

        命令:export LD_LIBRARY_PATH=./lib(动态库的路径)

      3)将LD_LIBRARY_PATH永久改变

        修改~/.bashrc配置文件,在文件最后export

      4)通过修改动态连接器的配置文件

        1)需要找到动态链接器的配置文件

          命令:ls -l /etc/ld.so.conf

        2)动态库的路径写入到配置文件中

          命令:vim /etc/ld.so.conf

        3)将动态库的路径添加到最后一行,然后保存退出vim

        4)更新链接配置文件

          命令:sudo ldconfig -v

  (5)优缺点

    优点:

      1)应用程序的体积小

      2)动态库更新,不一定需要重新编译应用程序

    缺点:

      1)发布程序的时候,需要发布动态库给用户

      2)动态库并没有打包到应用程序中去,加载速度相对较慢

Linux常用基础(三)的更多相关文章

  1. Linux常用基础命令(二)

    Linux常用基础命令 一.-ls--列表显示目录内容 二.-alias--设置别名 三.-du--统计目录及文件空间占用情况 四.-mkdir--创建新目录 五.-touch--创建空文件 六.-l ...

  2. Linux常用基础命令整理:关机命令、查看目录下文件命令等

    Linux常用基础命令整理:关机命令.查看目录下文件命令等 整理了一些Linux常用基础命令,欢迎指正. 首先记住四个热键,学会这四个键,收益一辈子. Tab按键---命令补齐功能Ctrl+c按键-- ...

  3. linux常用命令三

    linux常用命令三 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 ...

  4. Linux常用指令(三)

    进入京东运维组实习,收到了很多同事的热心指导,自己也努力学习,按照他们给出的学习计划,真的很充实,学到了很多不只是开发方面的知识. 以下简单记录下自己的笔记,方便以后查阅. 1.文件系统 Linux系 ...

  5. Linux常用基础指令

    Linux常用指令 一.基础命令 whoami查看当前用户 pwd查看当前所在位置 ls 查看当前文件夹的内容 ls -l或ll显示详细内容 cd 绝对路径:从根目录开始的路径 cd / 文件夹 返回 ...

  6. Linux常用基础命令三

    一.ln 软链接 软链接也称为符号链接,类似于 windows 里的快捷方式,有自己的数据块,主要存放 了链接其他文件的路径. 在查看文件目录中,软连接是以'l'开头 创建软链接 ln -s [原文件 ...

  7. 前后端同学,必会的Linux常用基础命令

    无论是前端还是后端同学,一些常用的linux命令还是必须要掌握的.发布版本.查看日志等等都会用到.以下是我简单的总结了一些简单又常用的命令,欢迎大家补充.希望能帮助到大家 本文首发于公众号 程序员共成 ...

  8. Linux入门基础(三):Linux用户及权限基础

    用户基础 用户和组 每个用户都拥有一个userid 每个用户都属于一个主组,属于一个或多个附属组 每个组拥有一个groupid 每个进程以一个用户身份运行,受该用户可访问资源限制 每个可登陆用户拥有一 ...

  9. Linux常用的三种软件安装方式

    一:Linux源码安装    1.解压源码包文件    源码包通常会使用tar工具归档然后使用gunzip或bzip2进行压缩,后缀格式会分别为.tar.gz与.tar.bz2,分别的解压方式:   ...

随机推荐

  1. css实现图片信息展示

    <style> .layui-fluid{padding: 15px;} .img-responsive{display: block;width: 100%;max-width: 100 ...

  2. 配置WDA程序到NWBC

    NWBC是通过角色来做的权限管理,包括菜单项. 如果用户没有分配对应的,登陆后看到的东西很少,或者空白. 这里需要先将BC的个性化参数全部配齐,方便使用.BC最左上角,点击,设置,个性化设置. 如下几 ...

  3. Fundebug 微信小程 BUG 监控插件更新至 1.2.1,优化错误上报次数的限制算法,新增 silentHttpHeader 配置选项

    摘要: 1.2.1优化错误上报次数的限制算法,新增silentHttpHeader配置选项,请大家及时更新哈! Fundebug提供专业的微信小程序 BUG 监控服务,可以第一时间为您捕获生存环境中小 ...

  4. Linux发展史与安装-Linux从入门到精通第一天(非原创)

    文章大纲 一.Linux发展史二.Linux系统的安装三.Linux系统的文件四.学习资料下载五.参考文章   一.Linux发展史 1. Linux前身-Unix 1968年 Multics项目MI ...

  5. LoadRunner脚本录制常见问题

    LoadRunner录制脚本时为什么不弹出IE浏览器?当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决. 启动浏览器,打开Internet ...

  6. 《linux就该这么学》课堂笔记16 bind域名解析

    1.DNS域名解析服务 DNS(Domain Name System,域名系统)是一项用于管理和解析域名与IP地址对应关系的技术,就是能够接受用户输入的域名或IP地址,然后自动查找与之匹配(或者说具有 ...

  7. python处理excel函数xlrd、xlwt

    https://www.jianshu.com/p/f2c9dff344c6 https://www.cnblogs.com/ilovepython/p/11068841.html 行列操作:http ...

  8. pod install/update失败:Failed to connect to 127.0.0.1 port 1080: Connection refused

    出现这类错误,通常是因为代理发生的,取消代理即可! 1.查看有无相关代理: git config --global http.proxy git config --global https.proxy ...

  9. request有get,post,put,delete等方法大全

    注:本文为个人学习摘录,原文地址为:http://javaeedevelop.iteye.com/blog/1725299 An HTTP request is a class consisting ...

  10. python的continue和pass的区别

    a = 'pythyon' i = 2 for element in a: if element == 'y': pass i = 3 else: print(element+str(i)) 结果: ...