Linux 学习笔记(十八)—— 动静态库

把自定义的方法给别人用,有两种方法:

  1. 把源代码给别人;
  2. 把源代码打包成库,给别人库文件和头文件;
一、创建静态库
复制代码
//Makefile
lib=libmymath.a
$(lib):mymath.o
    ar -rc $^  // replace and create 如果存在就替换,如果不存在就创建
mymath.o:mymath.c
    gcc -c $^

.PHONY:clean
clean:
    rm -fr *.o *.a lib

.PHONY:output
output:
    mkdir -p lib/include
    mkdir -p lib/mymathlib
    mv mymath.h ./lib/include
    mv libmymath.a ./lib/mymathlib

//mymath.h

extern int myerrno;

int add(int x, int y);
int sub(int x, int y);
int mul(int x, int y);
int div(int x, int y);

//mymath.c
#include "mymath.h"

int myerrno = 0;

int add(int x, int y)
{return x + y;}

int sub(int x, int y)
{return x - y;}

int mul(int x, int y)
{return x * y;}

int div(int x, int y)
{if(y == 0)
    {
    myerrno = 1;
    return -1;
    }

return x / y;}
二、使用静态库
复制代码
#include "mymath.h"

int main()
{
    printf("1 + 1 = %d\n", add(1, 1));
    printf("10 / 0 = %d\n, errno = %d", div(10, 0), myerrno);
    // 这里返回的"-1"如何知道是出错了还是计算结果就是-1;
    // 这里的errno出来的结果会是"0"
    // 因为C语言形参实例化的时候是从右向左的,所以先有了myerrno的值才计算除法
    printf("errno = %d,10 / 0 = %d\n", myerrno,div(10, 0));
    return 0;
}

**指令:**gcc main.c -I .lib/include/ -L .lib/mymathlib/ -lmymath


如果觉得太麻烦可以将头文件和库文件加入到系统目录中

【不建议这样操作,会污染系统文件,但是一般的第三方库都是这么做的;自己自定义的库可以采用软连接的方式,即放入软连接到系统目录中,也可以正常使用】

  • **头文件:**cp 文件.h /user/include
  • **库文件:**cp 文件.a /lib64/
  • **指令:**gcc main.c -lmymath 【最后的-lmymath还是不能省略】
三、创建动态库

**指令1:**gcc -fPIC【产生位置无关码】 -c 文件.c ------> 生成:文件.o

**指令2:**gcc -shared -o lib库名.so 文件.o

生成的so库文件会默认带有执行权限,是因为它会被调用,需要和可执行文件一起被加载到内存中;而静态库在链接之后就和可执行程序无关了,所以不需要执行权限;可执行权限的本质是当作可执行编码加载到内存中;

**指令3:**gcc main.c -I .lib/include/ -L .lib/mymathlib/ -lmymath

生成了"a.out",但是"./a.out"的时候会报错。因为上面编译的时候告诉了库和路径,加载的时候没有告诉库和路径,动态库没有被拷贝到可执行文件中,加载运行的时候也要去找调用的库;

相关推荐
健康平安的活着16 分钟前
langchain4j笔记篇(阳哥)
笔记
一川月白70918 分钟前
51单片机---硬件学习(跑马灯、数码管、外部中断、按键、蜂鸣器)
单片机·学习·51单片机·外部中断·蜂鸣器·数码管·跑马灯
励志不掉头发的内向程序员27 分钟前
STL库——二叉搜索树
开发语言·c++·学习
ホロHoro1 小时前
学习笔记:MYSQL(4)
笔记·学习·mysql
aaaweiaaaaaa2 小时前
c++基础学习(学习蓝桥杯 ros2有C基础可看)
c++·学习·蓝桥杯·lambda·ros2·智能指针·c++类
MadPrinter2 小时前
SpringBoot学习日记 Day11:博客系统核心功能深度开发
java·spring boot·后端·学习·spring·mybatis
wanzhong23334 小时前
ArcGIS学习-18 实战-降雨量空间分布插值分析
学习·arcgis
wanzhong23334 小时前
ArcGIS学习-19 实战-表面分析
学习
我命由我123454 小时前
Photoshop - Photoshop 创建文档
学习·ui·课程设计·设计·photoshop·ps·美工
@ZzHhXx4 小时前
嵌入式学习---(硬件)
学习