/usr/lib /lib:标准系统库文件
          库是一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的。它们通常有一组相互关联的函数组成以
          执行某项常见的任务。
          默认情况下,编译器只搜索标准C语言库。仅把库文件放在标准目录中,就希望编译器能够找到它,但库文件还需要遵
          循特定的命名规范,并且需要在命令行中明确指出。
         
          .a :传统的静态函数库
              也称作归档文件,我们可以很容易的创建自己的静态库,只要使用ar程序和使用gcc -c命令对函数分别进行编译。
              我们应该尽可能的把函数分别保存在不同的源文件中,如果函数需要访问公共数据,可以把它们放在同一个人源文
              件中,并使用在该文件中声明的静态变量
              静态库的一个缺点是当你同时运行许多应用程序并且它们都使用来自同一函数库的函数时,内存中就会有同一函数
              的多份副本,而且在程序文件本身也有同样的多份副本,这将消耗大量的内存和磁盘空间
             
          .so:共享函数库
              当一个程序使用共享库时,程序本身不在包含函数代码,而是引用运行时可访问的共享代码,当编译好的程序被装
              载到内存中执行时,函数引用被解析并产生对共享库的调用,如果有必要共享库才会被加载到内存中。使用这种方
              法,系统可以只保留共享库的一份副本供许多应用程序同时使用,并且在磁盘上也仅保留一份。而且共享库的更新
              可以独立于依赖它的应用程序。
              在Linux中,可以通过ldd来查看一个程序所需要的共享库。
              linlin@ubuntu:~/linlin/c_code/ar_lib$ ldd program_first
            linux-vdso.so.1 =>  (0x00007fff5d1a4000)
            libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5ef8f3c000)
            /lib64/ld-linux-x86-64.so.2 (0x0000555dd281e000)            
            
          函数库通常同时以静态库和共享库两种格式存在
          可以通过给出完整的库文件路径名或用-l标志来告诉编译器要搜索的库文件。
          gcc -o file file.c /usr/lib/libm.a
          gcc -o file file.c -lm
          这两条命令都是要求编译器编译文件file.c,并将产生的程序文件命名为file,并除了搜索标准的C语言函数库外,还
          搜索数学库已解决数学函数引用问题。
          -lm是简写方式,本例中表示/usr/lib/libm.a,-lm的好处是如果有共享库,编译器会自动选择共享库
         
     
      静态库使用:
        先为函数fred bill 创建各自的源文件,然后为他们分别编译
        linlin@ubuntu:~/linlin/c_code/ar_lib$ vim fred.c
      linlin@ubuntu:~/linlin/c_code/ar_lib$ vim bill.c
      linlin@ubuntu:~/linlin/c_code/ar_lib$ gcc -c bill.c fred.c

linlin@ubuntu:~/linlin/c_code/ar_lib$ ls
      bill.c  bill.o  fred.c  fred.o
      
      编译一个调用bill函数的程序,首先为库文件创建一个头文件这个头文件将声明库文件里的函数
      linlin@ubuntu:~/linlin/c_code/ar_lib$ vim lib_first.test.h
      调用库函数bill
      linlin@ubuntu:~/linlin/c_code/ar_lib$ vim program_first.test.c
      先要求编译器编译显示的指定目标,再将编译好的目标模块链接
      linlin@ubuntu:~/linlin/c_code/ar_lib$ gcc -c program_first.test.c
      linlin@ubuntu:~/linlin/c_code/ar_lib$ gcc -o program_first program_first.test.o bill.o
      linlin@ubuntu:~/linlin/c_code/ar_lib$ ./program_first
      bill: we passed Hello World
      创建一个库文件
      linlin@ubuntu:~/linlin/c_code/ar_lib$ ar crv libfoo.a bill.o fred.o
      a - bill.o
      a - fred.o
      linlin@ubuntu:~/linlin/c_code/ar_lib$ ls
      bill.c  bill.o  fred.c  fred.o  lib_first.test.h  libfoo.a  program_first  program_first.test.c  program_first.test.o
      在编译器使用的文件列表中添加该库文件来创建程序
      linlin@ubuntu:~/linlin/c_code/ar_lib$ gcc -o program_first_again program_first.test.o libfoo.a
      linlin@ubuntu:~/linlin/c_code/ar_lib$ ./program_first_again
      bill: we passed Hello World
      也可以使用—L选项访问函数库
      linlin@ubuntu:~/linlin/c_code/ar_lib$ gcc -o program_first_again2 program_first.test.o -L. -lfoo
      linlin@ubuntu:~/linlin/c_code/ar_lib$ ./program_first_again2
      bill: we passed Hello World

Linux_C——动态库,静态库的更多相关文章

  1. Linux 下动态库 / 静态库(依赖)

    一. 依赖动态库的动态库 libfun.so依赖动态库libtest.so(libfun.so动态库里的函数intnothing()调用了libtest.so里的intmytest()函数),而mai ...

  2. C++基础知识之动态库静态库

    一. 静态库与动态库 库(library),一般是一种可执行的二进制格式,被操作系统载入内存执行. 我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库 静态库和动态库区别: ...

  3. linux 动态库 静态库 函数覆盖

    本文讨论了linux动态库  静态库中函数的覆盖问题. 测试目的: 同名函数,分别打成动态库libdync_lib.so与静态库libstatic_lib.a,并把libstatic_lib.a打到另 ...

  4. Linux 动态库 静态库

    什么是库 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和Linux的本质不同,因此二者库的二进制是不兼容的.Linux操作系统支持的库函数分为静态库和动态库 ...

  5. C_动态库|静态库

    动态库 动态链接库简称DLL,同时以.dll 为后缀,主要用于提供代码和数据 dll 并不是所有数据都能被访问到,必须要进行导出 动态链接库在内存中始终只保存了一份数据,起到了节约内存的作用 生成动态 ...

  6. CMake 添加头文件目录,链接动态、静态库(添加子文件夹)

    CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...

  7. c/c++:动态库 静态库 linux/windows 例子 (转)

    作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). C++静 ...

  8. cmake 添加头文件目录,链接动态、静态库(转载)

    来源网址:http://www.cnblogs.com/binbinjx/p/5626916.html 罗列一下cmake常用的命令. CMake支持大写.小写.混合大小写的命令. 1. 添加头文件目 ...

  9. Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明

    本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法: 1.添加动态库(直接添加动态库文件.dll,非子项目) 通过qtcreator创建动态库的方法就不在此 ...

  10. golang 编译或链接 c语言动态、静态库的方法, golang 与 c语言 相互调用

    1.golang链接c静态库的方法可以见这个示例: https://github.com/atercattus/go-static-link-example https://github.com/sh ...

随机推荐

  1. centos7.x设置静态IP

    本教程以centOs7.4为例: 1.点击虚拟机的[编辑]选项,选择[虚拟网络编辑器] 2.选择[VMnet8],然后点击[NAT设置] 3.记录[子网掩码]和[网关IP],后面会用到 4.进入终端, ...

  2. react native 标签出错.

    这种错误为标签错误,没办法,你只能往标签上找了,但不一定是<Text></Text>,我是在<TextInput></TextInput>上出错的,多了 ...

  3. 大数据学习——hadoop安装

    上传centOS6.7-hadoop-2.6.4.tar.gz 解压 tar -zxvf centOS6.7-hadoop-2.6.4.tar.gz hadoop相关修改配置 1 修改 /root/a ...

  4. ubuntu使用git时,终端不显示git分支。

    1:问题描述: 在Windows环境下习惯使用git bash操作git分支,最近学习linux环境,发现linux环境终端不显示git分支,相关现象如下:      期望效果是: 我的linux环境 ...

  5. Codevs 3409 搬礼物

    时间限制: 1 s 空间限制: 64000 KB 题目等级 : 青铜 Bronze   题目描述 Description 小浣熊松松特别喜欢交朋友,今年松松生日,就有N个朋友给他送礼物.可是要把这些礼 ...

  6. Visual Studio Code Edit

    微软的跨平台编辑器~~ 下载地址(官网):https://code.visualstudio.com/ 下载地址(网盘):http://pan.baidu.com/s/1ntLy8Tr 使用技巧: c ...

  7. php之ThinkPHP的memcached类的修改

    php之ThinkPHP的memcached类的修改 在Think\Cache\Driver\Memcached.class.php中,增加方法获取错误信息的方法,方便调试, public funct ...

  8. POJ 3159 【朴素的差分约束】

    好吧终于知道什么是“高大上”的差分约束了.嗷嗷 题意: 小朋友们分糖果,某个小朋友不想另外一个小朋友分到的糖果数比自己多N块以上. 求编号为N的小朋友最多比编号为1的小朋友多分多少块糖果. 思路: 差 ...

  9. Netflix是什么,与Spring Cloud有什么关系

    说明:以下总结的观点不一定准确,但是是最好理解的. 1.首先,Netflix是一家做视频的网站,可以这么说该网站上的美剧应该是最火的. 2.Netflix是一家没有CTO的公司,正是这样的组织架构能使 ...

  10. java . 请在小于99999的正整数中找符合下列条件的数,它既是完全平方数,又有两位数字相同,如:144,676。

    import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; //请在小于99999的正整数中找符合下列条件的 ...