一 头文件与库文件(模块化,可重用,好维护)
在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统以及库函数调用的声明
库文件是一些预先编译好的函数的集合,那些函数都是按照可重用原则编写的。它们通常由一组互相关联的用来完成某项常见工作的函数构成
比如用来处理屏幕现实的函数和数据库访问例程等。

二 使用外部库
gcc -Wall calc.c -o calc -lm
-lm表示要链接libm.so或者libm.a

三  静态库与共享库
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库
动态库(.so或.sa):程序运行的时候才去链接共享库代码,多个程序共享使用库的代码

生产静态库
ar rcs libhello.a  hello_fn.o  :多个.o文件生成.a静态库 
ar是GNU归档工具,rcs表示replace and create
使用这个库
gcc -Wall -L. main.c -o main -lhello   (lib可省略.-L.表示库文件位置在当前目录下,否则在系统目录下搜索)

库搜索路径:
C_INCLUDE_PATH 、LIBRARY_PATH
从左到右搜索-I(指定头文件搜索路径) -L(指定库的搜索路径)指定的目录
由环境变量指定的目录
由系统指定的目录

四 生成共享库
shared:表示生成共享库
fPIC:产生位置无关码(指的是运行加载与内存地址无关)
库名规则:libxxx.so
gcc -shared -fPIC hello.o -o libhello.so

使用共享库
I:连接共享库,只要库名即可
L:链接库所在的路径
gcc -Wall -L. main.c -o main  -lhello

运行共享库
1、拷贝.so文件到系统共享库路径下 /usr/lib
2、更改LD_LIBRARY_PATH
3、Idconfig配置Id.so.conf,Idconfig更新Id.so.cache

五、GCC选项_-Wl,-soname

-Wl选项告诉编译器将后面的参数传递给链接器。

-soname则指定了动态库的soname(简单共享名,Short for shared object name)

soname的关键功能是它提供了兼容性的标准:

当要升级系统中的一个库时,并且新库的soname和老库的soname一样,用旧库链接生成的程序使用新库依然能正常运行。这个特性使得在Linux下,升级使得共享库的程序和定位错误变得十分容易。

在Linux中,应用程序通过使用soname,来指定所希望库的版本,库作者可以通过保留或改变soname来声明,哪些版本是兼容的,这使得程序员摆脱了共享库版本冲突问题的困扰。

可以通过readelf -d来查看每个动态库的SONAME

1. 声明libto.so.1,并生成libto.so.1.2

[root@localhost c]# gcc -fPIC -shared -Wl,-soname,libto.so.1 -o libto.so.1.2 to.c  
[root@localhost c]# ls -lh  
-rwxr-xr-x 1 root root 4268 Jan 10 17:22 libto.so.1.2  
[root@localhost c]# ldconfig -n ./  
lrwxrwxrwx 1 root root  12 Jan 10 17:23 libto.so.1 -> libto.so.1.2  
-rwxr-xr-x 1 root root 4.2K Jan 10 17:22 libto.so.1.2  
[root@localhost c]# readelf -d libto.so.1.2

gcc入门(下)的更多相关文章

  1. gcc入门

    gcc入门 1. 什么是gcc gcc的全称是GUN Compiler Collection,它是一个能够编译多种语言的编译器.最开始gcc是作为C语言的编译器(GNU C Compiler),现在除 ...

  2. 第二课 GCC入门之静态库以及共享库

    序言: 前面一课讲了gcc的简单入门,包括gcc编译步骤:预处理:编译:汇编:链接.今天这节课就来讲下linux的库也欢迎大家吐糟共同学习. 原理: linux系统中分为2种库:静态库和共享库.静态库 ...

  3. Linux编译工具:gcc入门

    1. 什么是gcc gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器.最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还 ...

  4. Linux gcc/g++下GDB调试及其调试脚本的使用

    GDB调试及其调试脚本的使用返回脚本百事通一.GDB调试 1.1. GDB 概述 GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB ...

  5. 【亲测】<g++/gcc>CentOS下g++: command not found问题的解决(c++环境安装)

    CentOS下g++: command not found问题的解决 2017年02月27日 18:09:06 阅读数:5174 标签: centosgcc 更多 个人分类: 问题分析   版权声明: ...

  6. 网易云课堂_C++程序设计入门(下)_第10单元:月映千江未减明 – 模板_第10单元 - 单元作业:OJ编程 - 创建数组类模板

    第10单元 - 单元作业:OJ编程 - 创建数组类模板 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提 ...

  7. 网易云课堂_C++程序设计入门(下)_第9单元:白公曾咏牡丹芳,一种鲜妍独“异常”_第9单元 - 作业5:OJ编程 - 使用异常进行图形类的错误处理

    第9单元 - 作业5:OJ编程 - 使用异常进行图形类的错误处理 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前 ...

  8. Python 装饰器入门(下)

    继续上次的进度:https://www.cnblogs.com/flashBoxer/p/9847521.html 正文: 装饰类 在类中有两种不通的方式使用装饰器,第一个和我们之前做过的函数非常相似 ...

  9. 第一课 GCC入门

    1序言 gcc是一个可移植的编译器,支持多种硬件平台:也不仅仅是一个本地编译器也是一个跨平台编译器:支持多张语言编译时按照模块化设计支持多种语言. gcc编译过程:预处理(预处理器):编译(编译器): ...

随机推荐

  1. nginx的变量系统

    本来想写一下nginx的脚本引擎的,但是看起来实在是有点庞大,一时间还不知道该从哪里写比较好.就先写一下他的变量系统吧,这是脚本引擎非常重要的组成部分. 首先为了表述清楚先规定几个术语吧 内置变量:n ...

  2. pytest文档42-fixture参数化params

    前言 参数化是自动化测试里面必须掌握的一个知识点,用过 unittest 框架的小伙伴都知道使用 ddt 来实现测试用例的参数化. pytest 测试用例里面对应的参数可以用 parametrize ...

  3. 【学习笔记】Min-max 容斥

    经常和概率期望题相结合. 对于全序集合 \(S\),有: \[\max S=\sum\limits_{T\subseteq S,T\not=\varnothing}(-1)^{\vert T\vert ...

  4. js获取页面高度

    <script> function getInfo() { var s = ""; s += " 网页可见区域宽:"+ document.body. ...

  5. 标签中colgroup的属性

    如需对全部列应用样式,<colgroup> 标签很有用,这样就不需要对各个单元和各行重复应用样式了. <colgroup> 标签只能在 table 元素中使用. 可选的属性 属 ...

  6. Java爬取同花顺股票数据(附源码)

    最近有小伙伴问我能不能抓取同花顺的数据,最近股票行情还不错,想把数据抓下来自己分析分析.我大A股,大家都知道的,一个概念火了,相应的股票就都大涨. 如果能及时获取股票涨跌信息,那就能在刚开始火起来的时 ...

  7. git学习(十一) idea git pull 解决冲突

    测试如下: 先将远程的代码修改,之后更新: 之后将工作区修改的代码(这里修改的代码跟远程修改的位置一样)提交到本地,之后拉取远程的代码,会发现有冲突: Accept Yours 就是直接选取本地的代码 ...

  8. Python包安装及使用指南

    这里长期更新一些Python第三方包的安装教程,以及使用教程... Pygame 安装教程: Windows: 首先,查看已安装的Python版本:访问https://www.lfd.uci.edu/ ...

  9. Sqoop源码解析

    date: 2020-05-31 12:09:00 updated: 2020-08-21 17:33:00 Sqoop源码解析 org.apache.sqoop 文件夹 参考文档: https:// ...

  10. Vue框架 周期

    用Vue框架,熟悉它的生命周期可以让开发更好的进行. 首先先看看官网的图,详细的给出了vue的生命周期: 它可以总共分为8个阶段: beforeCreate(创建前), created(创建后), b ...