• C语言函数篇(五)静态库和动态库的创建和使用


    使用库函数是源码的一种保护???  <我猜的.>

    库函数其实不是新鲜的东西,我们一直都在用,比如C库.

    我们执行pringf() 这个函数的时候,就是调用C库的函数.

     

    下面记录静态库和动态库的生成和使用.

     

    静态库:libxxx.a

    动态库:libxxx.so

     

    静态库: 在程序编译的时候,将库编译进可执行程序中, 运行的时候不需要外部函数库

    动态库: 在程序运行的时候,将库加载到程序中,运行的时候需要外部函数库

    函数库的目录有 /lib /usr/lib自定义

    一. 静态库的生成和使用

    下面通过一个简单的小栗子来介绍库函数怎么生成和使用.

    1.库函数的源码 hello.c

    #include "stdio.h"
    
    int hello(void){
    
        printf("hello lib");  
      return 0;
    }

    2. 库函数的头文件 hello.h

    #ifndef __HELLO_H
    #define __HELLO_H
    
    int hello(void);
    
    #endif

    库文件的头文件是库文件的目录,因为库文件是保护的,看不到里面的源码,所以把函数接口通过头文件来让人调用 .

    这样就实现了接口,也保护了源码

    3.编译静态库函数

    3.1 将 hello.c 编译成目标文件 生成  hello.o文件

    gcc -c hello.c

    3.2 将.o文件打包成静态库 生成 libhello.a库文件

    ar -cr libhello.a hello.o

     

    4 使用静态库,因为静态库是在编译的时候一起打包进程序的,所以如果编译的时候没有静态库文件,则无法编译

    4.1 main.c 写一个main函数来调用库函数

    #include "hello.h"    //引入库函数的头文件,这样才能找到函数声明
    
    int main{
      
      hello();        //调用库函数
    
    }

    正常编译的时候是没办法通过的. 因为编译器找不到 hello() 的实现代码. 如图:

    所以在编译的时候要加入库引用

    gcc -c main -L. -lhello -o a.out  

    -L<路径> 引用自定义库的路径,如果调用系统库就不用-L  '.'表示当前文件夹 

    -lxxxx 这里libhello.a 只要写hello 就可以   //小写的L

    4.2 直接可以执行,因为库函数已经被编译进去了

     

    二.动态库的编译及使用

    同样的hello.c 源码

    1.生成.o文件

    gcc -c -fpic hello.c //如果这里没有加-fpic 下一步就会提示你重新用 -fpic编译

    2. 编译成动态库

    gcc -shared -fpic -o libhello.so hello.o

    -shared 是生成动态库

    -fpic 生成位置无关代码,默认加

     

    3. 使用动态库 和静态库一样

    gcc main.c -L. -lhello -o a.out

    4. 执行 用动态库编译的程序没办法直接执行

    在读取共享库libhello.so的时候出错,没有找到该文件

    因为动态库程序会默认在 /lib  或者 /usr/lib的路径下寻找, 所以

    解决的办法有3个:

    1. 将.so 文件拷贝到 /usr/lib/文件夹下面

    2.添加PATH环境变量

    export LD_LIBRARY_PATH=<动态库所在的绝对路径>

    3.修改配置脚本

    将动态库所在的路径加到  /etc/ld.so.conf 文件里

    vim /etc/ld.so.conf

    添加后刷新

    /sbin/ldconfig

     

     

  • 相关阅读:
    关于直播的技术整理2
    关于直播的技术整理
    android drawable size
    Could not find gradle wrapper within android sdk
    基于开源Red5搭建的视频直播平台
    Cannot find module 'rxjs/operators/share'
    Cannot find type definition file for '.svn'
    Ionic国际化解决方案
    本博客停止更新改用wordperss
    Powershell批量安装SNMP服务
  • 原文地址:https://www.cnblogs.com/kmist/p/10088585.html
Copyright © 2020-2023  润新知