zoukankan      html  css  js  c++  java
  • linux共享库

    库:是一组预先编译好的函数的集合,linux中标准系统库文件一般存储在/lib和/usr/lib目录中

    静态库:在程序编译过程中,就被链接到了程序编写者所写的源代码中,静态库以.a结束。

    共享库:在程序运行时载入,编译时只需说明所需要的共享库文件即可。共享库以.so接受。

    头文件:用于保存程序的声明。

    makefile文件:makefile带来的好处就是——“自动化编译”,一旦写好各文件的依赖项及其编译方式,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

    一.共享库示例:

    1、在bill.h头文件中,写函数求数组最大元素的函数声明;

    $ more bill.h
    int bill(int a[], int n);

    2、在bill.c文件中引入头文件,写该函数的实现;
    $ more bill.c
    #include "bill.h"
    int bill(int a[], int n)
    {
        int i,max = a[i];
        for( i = 0; i < n; ++i)
        {
            if( max < a[i])
            {
                max = a[i];
            }
        }
        return max;
    }
    3、在main.c中写主程序内容,调用该函数,此时,需要引入头文件
    $ more main.c
    #include <stdio.h>
    #include "bill.h"
    int main()
    {
        int MAX;
        int ar[10] = {1,23,21,34,45,56,57,48,90,100};
        MAX = bill(ar,10);
        printf("%d ",MAX);
        return 0;
    }

    4、编译共享库以及main.c;
    $ gcc -shared -fPIC bill.c -o libbill.so

    结果如下:

    $ ls
    bill.c  bill.h  libbill.so  main.c

    5、设置环境变量(未设置环境变量,则系统只在默认的标准路径下寻找共享库,设置了环境变量之后,则系统首先在环境变量指定的路径下寻找共享库)

    /*此环境变量的设置只是对于共享库而言*/
    $ export LD_LIBRARY_PATH=./

    6、编译生成可执行程序/* 其中-L.表示库文件的查找路径为当前路径(.),-lbill表示所要使用的文件共享库文件名为bill

    头文件由于处于当前路径,故可以省略不写,当处于系统标准路径时也可省略不写*/
    $ gcc -o main main.c -L. -lbill

    7、编译成功,执行main程序
    $ ls
    bill.c  bill.h  libbill.so  main  main.c
    $ ./main
    100

    二.共享库的makefile:

    仍然上面为例子:

    1、上例中源代码为:

    $ ls
    bill.c  bill.h  main.c  makefile
    2、makefile文件如下:

    $ more makefile
    main: main.o libbill.so
    export LD_LIBRARY_PATH=./
    gcc -o main main.c -L. -lbill
    main.o: main.c bill.h
    gcc -c main.c
    libbill.so: bill.c
    gcc -shared -fPIC bill.c -o libbill.so

    3、make的过程:

    $ make
    gcc -shared -fPIC bill.c -o libbill.so
    export LD_LIBRARY_PATH=./
    gcc -o main main.c -L. -lbill

    4.执行结果为:

    $ ./main

    100

  • 相关阅读:
    jeecg接口开发及权限实现原理
    Jeecg中通过Spring_AOP+注解方式实现日志的管理
    Jeecg踩坑不完全指南
    在jeecg中如何配置多对一和多对多的关系
    一致性哈希算法
    到底什么是哈希Hash?
    如何正确实现 Java 中的 HashCode
    Hash和HashCode深入理解
    关于源码
    MySQL存储过程的创建及调用
  • 原文地址:https://www.cnblogs.com/jjkv3/p/3821405.html
Copyright © 2011-2022 走看看