首页 > 系统相关 >Linux系统编程03-动态库

Linux系统编程03-动态库

时间:2022-10-14 22:14:13浏览次数:34  
标签:03 gcc main lib int 编程 so Linux include

动态库制作

  • 命名规则
    • Linux: libxxx.so
      • lib: 前缀
      • xxx: 库的名字
      • .so: 后缀
    • Windows: libxxx.dll
  • 制作:
    • gcc 生成 .o 文件, 得到和位置无关的代码 gcc -c -fpic/fPIC a.c b.c
    • gcc 生成动态库 gcc -shared a.o b.o -o libcalc.so

实例:

add.c

#include <stdio.h>
#include "head.h"
int add(int a, int b)
{
    return a+b;
}

div.c

#include <stdio.h>
#include "head.h"
double divide(int a, int b)
{
    return (double)a/b;
}

mult.c

#include <stdio.h>
#include "head.h"
int multiply(int a, int b)
{
    return a*b;
}

sub.c

#include <stdio.h>
#include "head.h"
int subtract(int a, int b)
{
    return a-b;
}

head.h

#ifndef _HEAD_H
#define _HEAD_H

// 加法
int add(int a, int b);
// 减法
int subtract(int a, int b);
// 乘法
int multiply(int a, int b);
// 除法
double divide(int a, int b);

#endif

main.c

#include <stdio.h>
#include "head.h"

int main()
{
    int a = 20;
    int b = 12;
    printf("a = %d, b = %d\n", a, b);
    printf("a + b = %d\n", add(a, b));
    printf("a - b = %d\n", subtract(a, b));
    printf("a * b = %d\n", multiply(a, b));
    printf("a / b = %f\n", divide(a, b));
    return 0;
}
  1. 生成位置无关代码 gcc -c -fpic add. c div.c mult.c sub.c 生成目标文件

  2. 生成动态库gcc -shared *.o -o libcalc.so

  3. 整理目录:

    image-20221014114746284

  4. 使用动态库: gcc main.c -o main -I ./include -L ./lib -l calc

  5. 执行main 时会报错 error while loading shared libraries: libcalc.so : cannot open shared object file: No such file or directory

定位共享库文件

环境变量方法

  • env 可以查看环境变量

  • 临时配置export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/lib

  • 用户级别的配置, 打开.bashrc, 最下面输入exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/lib, 输入 source .bashrc生效(推荐此方法)

  • 系统级别的配置 sudo vim /etc/profile, 最下面输入exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/lib, source /etc/profile生效

  • 使用 ldd main 查看动态库

            linux-vdso.so.1 (0x00007ffe9bdee000)
            libcalc.so => /home/xxx/lib/libcalc.so (0x00007fe7524f6000)
            libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe7522f1000)
            /lib64/ld-linux-x86-64.so.2 (0x00007fe752502000)
    
  • 运行程序 ./main

    a = 20, b = 12
    a + b = 32
    a - b = 8
    a * b = 240
    a / b = 1.666667
    

修改文件方法

无法直接修改/etc/ld.so.cache, 需要编辑sudo /etc/ld.so.conf, 添加动态库的路径, 更新sudo ldconfig 即可

放入指定目录方法

直接放入 /lib/, /usr/lib目录, 系统的动态载入器能直接扫描到. (不推荐此方法)

标签:03,gcc,main,lib,int,编程,so,Linux,include
From: https://www.cnblogs.com/anqwjoe/p/16793178.html

相关文章

  • Linux系统编程02-静态库
    库简单的看作可以直接拿来使用的代码仓库静态库在程序的链接阶段被复制到了程序中动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程......
  • Linux系统编程06-open
    open#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>intopen(constchar*pathname,intflags);打开文件作用:打开一个已经存在的文件flags......
  • Linux系统编程05-GDB调试
    首先需要加入调试选项-g,在可执行文件中加入源代码信息,打开所有警告-Wallgcc-g-Wallprogram.c-oprogram启动:gdb可执行程序退出:quit设置参数:set......
  • Linux系统编程04-Makefile
    文件命名:makefile或Makefile规则:一个Makefile文件中可以有一个或多个规则目标...:依赖...​ 命令(shell命令)​ ...目标:最终生成的文件依赖:......
  • Linux系统编程07-read和write
    read和write函数#include<unistd.h>ssize_tread(intfd,void*buf,size_tcount);参数:fd:文件描述符,open得到的,用来操作某个文件buf:要读取数据......
  • 《Unix/Linux系统编程》第四章学习笔记 20201209戴骏
    第四章并发编程知识点归纳1、并行计算导论在早期,大多数计算机只有一个处理组件,称为处理器或中央处理器(CPU)。受这种硬件条件的限制,计算机程序通常是为串行计算编写的。......
  • 刷题 LeetCode 203 707 206
    代码随想录LeetCode203. 移除链表元素carl链表#dummyNode思路借助dummyNode简化判断条件细节dummyNode方法保持操作一致性LeetCode707. 设计链表carl......
  • Linux常用命令
    cd:切换目录用法:cd绝对路径切换路径cd相对路径切换路径cd~或者cd回到自己的家目录(root目录)cd-回到上一次所在目录cd..回到当前目录的上一......
  • 代码随想录算法训练营第三天 | 203.移除链表元素 707.设计链表 206.反转链表
    链表的数据结构基础链表结构链表是一种通过指针串联在一起的线性结构。每一个节点由两钟部分构成,一部分是数据域,一部分是指针域,指针域存放的指针指向另一个节点。链表......
  • 创建贷项订单报错: 不允许业务对象 BUS2032 和销售凭证类别 K 的组合
    使用BAPI_SALESORDER_CREATEFROMDAT2 创建正常销售订单没问题,但是创建贷项订单的时候报错:换成SD_SALESDOCUMENT_CREATE即可......