静态库和动态(共享)库
静态库:编译程序在编译使用库提供的功能代码的程序时将代码复制到该程序然后编译成可执行程序,这种库成为静态库
共享库:共享库比静态库的处理方式更加灵活,因而其产生的可执行文件更小,其文件后缀为 .so,代表共享对象(shared object)
   使用共享库链接的可执行程序只包含了它所需要的函数的表格,并没有从目标文件中复制全部的外部函数的机器代码
  在可执行文件开始执行时,操作系统将外部函数的机器代码从磁盘上的共享文件复制到内存中,这个过程称为动态链接。
  它使可执行文件更加精简而且节省磁盘空间,这是因为共享库可在多个程序间共享
  操作系统允许物理内存中共享库的一个复制被所有正在运行的程序使用,因此能节省内存
  共享库使得程序员可根据需要随时跟新库文件,只要接口不变,那么使用它的源程序就不需要重新编译
  基于这些优点,当系统中同时存在共享库和静态库时,gcc会默认使用共享库文件

当使用lname选项指定库名称时,gcc首先搜索在路径中是否有libname.so文件,如果有则使用该文件,如果没有,则继续查找是否有
libname.a静态库文件
GCC创建静态库文件方法

calc.h
int aver(int,int);
int sum(int,int);
aver.c
#include "calc.h"
int aver(int num1,int num2)
{
return (num1+num2)/;
}
sum.c
#include "calc.h"
int sum(int num1,int num2)
{
return (num1+num2);
}
mian.c
#include <stdio.h>
#include "calc.h" int main(){
int v1,v2,m,sum2;
v1=;
v2=;
m=aver(v1,v2);
sum2=sum(v1,v2);
printf("aver(%d,%d)=%d\n",v1,v2,m );
printf("sum(%d,%d)=%d\n",v1,v2,sum2 ); }

编译为目标文件而不进行汇编和链接
gcc -c -o aver.o aver.c
gcc -c -o sum.o sum.c
ar rc libmycalc.a aver.o sum.o
gcc main.c -static -L. -lmycalc -o static-main

linux环境下gcc静态编译/usr/bin/ld: cannot find -lc错误原因及解决方法
原因:
一般出现这个问题的时候,Makefile中肯定有-static选项。这其实是静态链接时没有找到libc.a
需要安装glibc-static.xxx.rpm,如glibc-static-2.12-1.107.el6_4.2.i686.rpm,或是yum install glibc-static

GCC创建共享库文件方法

gcc -c -fPIC aver.c -o aver.o
gcc -c -fPIC sum.c -o sum.o
gcc -shared -o libmycalc.so aver.o sum.o
gcc main.c -L. -lmycalc -o shared-main
执行shared-main之前
vim /etc/profile
加上
export LD_LIBRARY_PATH=.
. /etc/profile
shared-main比static-main小的多

gcc创建静态库和共享库的更多相关文章

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

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

  2. Linux下库的制作(静态库与共享库)

    库中实际上就是已编译好的函数代码,可以被程序直接调用. Linux下的库一般的位置在/lib或者/usr/lib中 静态库 静态库是复制拷贝到调用函数中的,函数运行的时候不再需要静态库,因为静态库是在 ...

  3. Linux 静态库与共享库的使用

    申明: 正如题如示,本篇讲的是Linux下是静态库与共享库,而Window下的动态链接库详细情况可见这篇文章:windows动态链接库 DLL 浅析.虽然原理,思想差不多,但是细节却各有不同. 一.静 ...

  4. 【转】Linux 静态库与共享库的使用

    原文网址:http://blog.csdn.net/heyabo/article/details/11688517 申明: 正如题如示,本篇讲的是Linux下是静态库与共享库,而Window下的动态链 ...

  5. linux下的静态库和共享库

    转载&&增加:      我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期 ...

  6. Linux命令(十二)制作静态库和共享库

    1. 静态库 静态库文件命名:libxxxx.a 1.1 步骤: ar rcs libCalc.a *.o 1.2 用nm查看文件内容 1.3 发布并使用 gcc main.c -o mycpp.ou ...

  7. Linux静态库和共享库

    1.什么是静态库静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Windows动态链接库DLL 特点:包含函数代码声明和实现,链接后所有代码都嵌入到宿主程序中. 只在 ...

  8. Linux静态库和共享库【转】

    转自:http://www.cnblogs.com/zlcxbb/p/6806269.html 1.什么是静态库 静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Wi ...

  9. ubuntu下借助qt creator创建属于自己的共享库

    简介: 在 Windows 上,共享库由 .dll 表示:在 Linux 上,由 .so 表示. Shared Library的优势 共享库,又称动态库或so文件,顾名思义,它可以在可执行文件启动时加 ...

随机推荐

  1. 我对let和const理解

    ​let和const是es6新出的两种变量声明的方式,接下来我来分别针对这两个,聊一聊. let ​let它的出现,我认为主要是解决了块级作用域的需求.因为js以前本身是没有什么块级作用域的概念的(顶 ...

  2. SpringBoot使用log4j

    1.添加log4j相关依赖 在pom.xml文件中添加相关依赖: <!--配置log4j--> <dependency> <groupId>org.springfr ...

  3. 初学Java Web(1)——Web概述

    已经很久没有更新博客了,过年忙着吃喝玩乐,就怠惰了一小下下?幸好这学期新开的课程都比较有趣--Java Web和Android.至少对于我自己来说,既充满挑战,又富有趣味. --[1.Web概述]-- ...

  4. python 杂货铺

    python 杂货铺之不知道的python操作 1.交互模式下的神奇的_ windos中cmd交互模式中下(python2,python3),最近一个表达式的值赋给变量 _.这样我们就可以把它当作一个 ...

  5. orchard-1.9.2-1.10.2汉化

    安装 首先从github上下载orchard源代码:https://github.com/OrchardCMS/Orchard(下载版本最新的1.10.2) 使用vs2017打开源代码,运行进入安装界 ...

  6. Java中的变量数据类型补充

    Java中变量的数据类型的补充 变量按照数据类型进行分类 1.基本数据类型 数值型:①整数类型(byte,short,int,long)②浮点型(float,doubbe)③字符型(char)④布尔型 ...

  7. Java基础之关键字,标识符,变量

    Java基础 首先,来看一下Java基础知识图解,以下便是在java学习中我们需要学习设计到的一些知识(当然不是很完全). 这些都是接下来在以后的学习中我们会学到的一些知识. 1 关键字 首次先来学习 ...

  8. vue-router详解——小白速会

    一.概述 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用. vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来. ...

  9. 深入理解.net - 2.多态 Polymorphsim

    通过上篇文章 继承的本质 深入介绍了继承过程中对象的的创建过程,相信对继承已经有了一个深入的理解,本文则详细剖析一下面向对象设计的另一要素多态(Polymorphsim). 什么是多态 官方MSDN上 ...

  10. Log4j1.2配置详解

    Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志的输出到控制台,或者文件等等. 同时,在各大框架中也主要是使用log4j来进行日志的输出. 下面是log4j1.x版本的详细 ...