静态库和动态(共享)库
静态库:编译程序在编译使用库提供的功能代码的程序时将代码复制到该程序然后编译成可执行程序,这种库成为静态库
共享库:共享库比静态库的处理方式更加灵活,因而其产生的可执行文件更小,其文件后缀为 .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. maven常见问题处理(3-3)Gradle编译时下载依赖失败解决方法

    Gradle编译时在本地仓库中如果没有发现依赖,就会从远程仓库中下载, 默认的远程仓库为 mavenCentral(),即 http://repo1.maven.org/maven2/往往访问速度特别 ...

  2. 官网jquery压缩版引用地址:

    3.1.1版本 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  3. Python/MySQL(四、MySQL数据库操作)

    Python/MySQL(四.MySQL数据库操作) 一.数据库条件语句: case when id>9 then ture else false 二.三元运算: if(isnull(xx)0, ...

  4. js通过class获取元素时的兼容性解决方案

    1:::::方法代码如下:function getByClass(sClass){    var aResult=[];    var aEle=document.getElementsByTagNa ...

  5. contenteditable 插入及粘贴纯文本内容

    本文主要介绍 div 标签设置  contenteditable = ' true ' 时,在光标位置插入输入的内容,或在光标位置粘贴纯文本内容.文中涉及知识,可参考以下: http://www.zh ...

  6. python3全栈开发-异常处理

    一. 什么是异常 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异常如下 而错误分成两种 ...

  7. [LeetCode] Word Abbreviation 单词缩写

    Given an array of n distinct non-empty strings, you need to generate minimal possible abbreviations ...

  8. angularjs中使用 <input type="file">标签实现一次最多上传5张图片

    前期准备: 1.angular.js 2.bootstrap.css 具体如何实现呢?请看下面代码哈哈哈. 在angular项目中,如果要给<input type="file" ...

  9. xcode7,AFN不能使用的问题

    今天手贱立刻升级了Xcode7,结果AFN报错,且不能用了,解决办法如下 第一步:升级AFN到2.6.0 完成之后,运行,结果请求都失败,提示 The resource could not be lo ...

  10. 接口自动化测试:python+json+requests+数据驱动

    接口测试是单元测试的一个子集,但又不等同于单元测试.从测试的角度来看,接口测试的价值在于其测试投入比单元测试少,而且技术难度也比单元测试小.一般来说,接口测试的粒度要比单元测试更粗,它主要是基于子系统 ...