一、linux下的静态库
  静态库中的被调用的函数的代码会在编译时一起被复制到可执行文件中去的!!可执行文件在运行不需要静态库的存在!
 
二、linux下动态库的构建和使用
1、动态库的构建
   gcc  -fPIC  -shared    -o  lib库名.so   源文件列表
 
例:
   gcc   -fPIC  -shared  -o  libmylib.so  max.c  min.c
 
2、动态库使用
   gcc    -o  最终的可执行文件  源文件列表  -L 动态库的目录  -l库名
 
例子:
已经将int  getMax(int,int)和getMin(int,int)打包在了libmylib.so中了,现在你即可把libmylib.so复制希望用你的库函数的人了!!
 使用你的库函数的人可能回这样使用:
   //test.c
          int getMax(int,int);
          int main()
{
int x,y;
 int max;
scanf(“%d%d”,&x,&y);
max=getMax(x,y);//getMax是在你的库函数中已经实现了的,所以不用别人在实现了,直接拿来用就行了!!
printf(“max=%d\n”,max);
return 0;
}
 
执行该命令:gcc  -o  test  test.c 会报错:提示找不到getMax;
正确的命令:gcc  -o  test test.c  -L libmylib.so存放的目录   -lmylib
错误的写法:gcc  -o  test test.c  -L libmylib.so存放的目录   -llibmylib.so
 
 
查看动态库中的标号:
readelf  -s  动态库名 
 
查看可执行文件运行时所依赖的动态库:
(1)ldd  可执行文件名
(2)readelf  -d   可执行文件名|grep  Shared
 
3、动态链接的可执行文件的运行(任选一种即可)):解决的是可执行文件在运行时找动态库
(1)将动态库复制到/lib或/usr/lib目录下;(在嵌入式开发,推荐用此方法!)
     命令:
正确:sudo  cp  libmylib.so  /lib/ 
错误:sudo  cp  libmylib.so  /lib/mylib.so
错误:sudo  cp  libmylib.so  /lib/libmylib
(2)将动态所在目录路径添加到环境变量LD_LIBRARY_PATH
     例如:     
     export  LD_LIBRARY_PATH=动态库所在的目录:$LD_LIBRARY_PATH
     如果需要LD_LIBRARY_PATH一直生效,则需把上面的语句添加到~/.bashrc文件中末尾去。
     命令:
gedit   ~/.bashrc
偷懒的办法(慎用):
echo  export LD_LIBRARY_PATH=$PWD:\$LD_LIBRARY_PATH>>~/.bashrc
(3) 将动态所在的目录添加到/etc/ld.so.conf中,启动会自动加载/etc/ld.so.conf配文件,如果需要立即生效,执行命令:ldconfig
命令:
sudo gedit  /etc/ld.so.conf
 
三、静态库、动态库使用上的区别
静态库被调用的代码生成可执行文件时会被立即复制到执行性文件中去;
动态库被调用的代码在可执行文件运行时才会被加载到可执行文件中去。

linux下的静态库和动态库的更多相关文章

  1. Linux 下的静态(函数)库、动态(函数)库

    0. 基本 在命名上,静态库的名字一般是 libxxx.a,动态库的名字一般是 libxxx.so,有时 libxxx.so.major.minor,xxx 是该 lib 的名字,major 是主版本 ...

  2. linux下添加动态链接库路径、动态库加载等方法

    linux下添加动态链接库路径的方法 2017年01月20日 10:08:17 阅读数:5596   Linux共享库路径配置 Linux下找不到共享库文件的典型现象为明明已经安装某个软包(如libn ...

  3. linux下项目开发加载动态库:ldconfig与 /etc/ld.so.conf

    场景:自己开发一个项目,程序里包含一些自定义动态库.运行,需要加载这些动态库. 假如这些库在/pro/output/lib/下面,可执行程序在/pro/output/bin/下面. 那么,我们需要: ...

  4. Linux下Gcc生成和使用静态库和动态库详解(转)

    一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...

  5. 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库

      最近在编写的一个Apache  kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a    静态库编译的,,,而我们这 ...

  6. Linux下Gcc生成和使用静态库和动态库详解

    参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...

  7. [转]Linux下用gcc/g++生成静态库和动态库(Z)

    Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10|  分类: linux |  标签:链接库  linux  g++  gcc  |举报|字号 订阅     ...

  8. linux下的共享库(动态库)和静态库

    1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...

  9. 【转】Linux下gcc生成和使用静态库和动态库详解

    一.基本概念 1.1 什么是库 在Windows平台和Linux平台下都大量存在着库. 本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不 ...

  10. (笔记)Linux下的静态库和动态库使用详解

    库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 一.静态库和动态库的区别 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比 ...

随机推荐

  1. FreeType 管理字形

    转自:http://blog.csdn.net/hgl868/article/details/7254687 1.字形度量 顾名思义,字形度量是对应每一个字形的特定距离,以此描述如何对文本排版.    ...

  2. 手机定位室内gps没信号

    手机定位一般分3种,gps,手机信号基站,上网地点,其中gps信号一般只有户外有,所以在室外的时候只开启定位和gps就可以定位了,但是在室内没有gps的情况,就需要开网络定位了.

  3. C# EntityFramwork(Model First)使用要点

    本文介绍EntityFramework使用方法 Entity Framework的注意点 由于安装和操作的细节讲起来很琐碎,这部分只罗列出难点,其他细节请自行查阅 安装细节 Pluralize or ...

  4. Ubuntu 开启telnet、ftp服务

    Telnet 这里我们就来对Ubuntu Linux telnet的安装设置进行一下讲解. 1. sudo apt-get install xinetd telnetd 2. Ubuntu Linux ...

  5. PHP实现常用排序算法(含示意动图)

    目录 1 快速排序 2 冒泡排序 3 插入排序 4 选择排序 5 归并排序 6 堆排序 7 希尔排序 8 基数排序 总结 作为phper,一般接触算法的编程不多. 但基本的排序算法还是应该掌握. 毕竟 ...

  6. 监控和安全运维 1.3 cacti增加客户端监控

    二. 安装客户端(增加一个linux服务器) 1.在客户端上 安装snmp yum install -y net-snmp 2. 修改snmpd.conf vim /etc/snmp/snmpd.co ...

  7. python爬虫(1)--Urllib库的基本使用

    这里使用python2.7,pycharm进行代码编写 1.爬一个静态网页示例 import urllib2 response = urllib2.urlopen("http://www.b ...

  8. css代码结构

    整个文档结构如下: 一般性样式 主体样式 reset样式 链接 标题 其他元素 辅助样式 表单 通知和错误 一致的条目 页面结构 标题.页脚和导航 布局 其他页面结构元素 页面组件 各个页面 覆盖

  9. Node 中的 stream (流)

    流的概念 流(stream)在 Node.js 中是处理流数据的抽象接口(abstract interface). stream 模块提供了基础的 API .使用这些 API 可以很容易地来构建实现流 ...

  10. Condition实现多线程顺序打印

    Condition实现多线程顺序打印: import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.R ...