一、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. wp8安装SSL证书

    把证书打成zip包,wp8的IE能下载并打开ZIP包,然后点击cer文件,就能安装证书了

  2. C语言学习笔记--#error 、 #line 和 #pragma 的使用

    1. #error 的用法 (1)#error 是一种预编译器指示字,用于生成一个编译错误消息 (2)用法:#error message //注意:message 不需要用双引号包围 (3)#erro ...

  3. Hadoop运行程序不报错只有warn也没反应也不输出结果的解决办法

    log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFact ...

  4. python爬虫框架(1)--框架概述

    框架概述 其中比较好用的是 Scrapy 和PySpider.pyspider上手更简单,操作更加简便,因为它增加了 WEB 界面,写爬虫迅速,集成了phantomjs,可以用来抓取js渲染的页面.S ...

  5. C++——const

    参考:https://www.cnblogs.com/Forever-Kenlen-Ja/p/3776991.html ; //修饰变量,a不能该内容(更改为其他的值) int* const p = ...

  6. cocos打包到ios与android上音频推荐

    首先贴一张官方对于ios与android上音频格式的推荐: 这里只给出了推荐格式,一般我们在实际运用中会使用如下方式: 一.IOS与安卓各一套:音乐:都使用MP3    音效:ios用caf Andr ...

  7. Java-马士兵设计模式学习笔记-工厂模式-简单工厂

    一.概述 1.目标:要控制任意类型交通工具的生产模式 2.目标有两层意思(1)任意类型 (2)生产模式,所以对应的,要这两个层面上抽象(Movable,VehicleFactory),利用接口,实现多 ...

  8. Django框架 之 admin管理工具(源码解析)

    浏览目录 单例模式 admin执行流程 admin源码解析 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在 ...

  9. 多线程学习-基础(六)分析wait()-notify()-notifyAll()

    一.理解wait()-notify()-notifyAll()obj.wait()与obj.notify()必须要与synchronized(Obj)一起使用,也就是wait,notify是针对已经获 ...

  10. 笔录---果壳中的C#第一章

    ---恢复内容开始--- 笔录---果壳中的C#第二章 2.1 第一个C#程序 1.C#语句按顺序执行,以“:”结尾. Console.WriteLine();     console 为类,Writ ...