• C语言编辑链接


    库函数(Library Files)
    库函数就是函数的仓库,它们都经过编译,重用性不错。通常,库函数相互合作,来完成特定的任务。比如操控屏幕的库函数(cursers和ncursers库函数),数据库读取库函数(dbm库函数)等。
    系统调用的标准库函数一般位于/lib以及/usr/lib。C编译器(精确点说,连接器)需要知道库函数的位置。默认情况下,它只搜索标准C库函数。

    库命名格式

    库函数文件通常开头字母是lib。后面的部分标示库函数的用途(比如C库函数用c标识, 数学库函数用m标示),小数点后的后缀表明库函数的类型:
    .a 指静态链接库
    .so 指动态链接库

    比如下面的mysql软件lib目录下的链接库

    [root@itoracle lib]# ll |grep mysqlclient
    -rw-r--r-- 1 mysql mysql 24878526 Apr  8  2018 libmysqlclient.a
    lrwxrwxrwx 1 mysql mysql       20 Apr  8  2018 libmysqlclient.so -> libmysqlclient.so.21
    lrwxrwxrwx 1 mysql mysql       25 Apr  8  2018 libmysqlclient.so.21 -> libmysqlclient.so.21.0.11
    -rwxr-xr-x 1 mysql mysql 10876320 Apr  8  2018 libmysqlclient.so.21.0.11

    共享链接库(Shared Libraries)
    静态链接库的一个缺点是,如果我们同时运行了许多程序,并且它们使用了同一个库函数,这样,在内存中会大量拷贝同一库函数。这样,就会浪费很多珍贵的内存和存储空间。使用了共享链接库的Linux就可以避免这个问题。
    共享函数库和静态函数在同一个地方,只是后缀有所不同。比如,在一个典型的Linux系统,标准的共享数序函数库是/usr/lib/libm.so。
    当一个程序使用共享函数库时,在连接阶段并不把函数代码连接进来,而只是链接函数的一个引用。当最终的函数导入内存开始真正执行时,函数引用被解析,共享函数库的代码才真正导入到内存中。
    这样,共享链接库的函数就可以被许多程序同时共享,并且只需存储一次就可以了。也常称为动态链接库。
    共享函数库的另一个优点是,它可以独立更新,与调用它的函数毫不影响。契合了解耦的思想。

    linux动态链接库位置

    linux系统动态库默认位置为 /lib and /usr/lib, by default

    动态链接库示例

    vim myfunc.c
    #include <stdio.h>
    int getnum(){
      return 5;
    }

    gcc -c -fPIC myfunc.c
    gcc -shared -fPIC -o libmyfunc.so myfunc.o
    mkdir /usr/local/mylib
    cp libmyfunc.so /usr/local/mylib/

    在环境变量中添加自定义lib库的位置

    export LD_LIBRARY_PATH=/usr/local/mylib:$LD_LIBRARY_PATH

    vim chk.c
    #include <stdio.h>
    int main(){
      extern int getnum();
      printf("return value is %d ",getnum());
      return 0;
    }

    gcc -c chk.c
    gcc -o chk chk.o -L. -lmyfunc    #-L查找范围为当前目录 -l动态链接库名
    ./chk
    return value is 5

    头文件(Head Files)
    在C语言和其他语言中,头文件声明了系统函数和库函数,并且定义了一些常量。对于C语言,头文件基本上散落于/usr/include和它的子文件夹下。其他的编程语言的库函数分布在编译器定义的地方,
    比如在一些Linux版本中,X Window系统库函数分布在/usr/include/X11,GNU C++的库函数分布在/usr/include/g++。这些系统库函数的位置对于编译器来说都是“标准位置”,即编译器能够自动搜寻这些位置。

    如果想引用位于标准位置之外的头文件,我们需要在调用编译器的时候加上-I标志,来显式的说明头文件所在文件夹。比如,
            $ gcc -I/usr/openwin/include hello.c
    会告诉编译器除了标准位置外,还要去/usr/openwin/include看看有没有所需的头文件。详细情况见编译器的使用手册(man gcc)。

  • 相关阅读:
    朴灵:基于MongoDB与NodeJS构建物联网系统
    平均年薪40万!为什么却很少见程序员炫富?
    写春联、变魔术、模仿马云唱歌_为你揭秘阿里云人工智能ET背后的技术
    Mysql查询性能优化-善用Explain语句
    numpy linspace arange函数
    vim笔记
    redis压缩列表
    tensorflow笔记之反向传播时用到的几种方法
    损失函数
    kafka 修改partition,删除topic,查询offset
  • 原文地址:https://www.cnblogs.com/perfei/p/10919710.html
Copyright © 2020-2023  润新知