Linux 动态库的编译和使用

1、总体思路:首先建立两个大目录 APP 应用程序 和 LIB 库,在LIB里边编译出一个libtest.so 动态库,在APP 里边写一个测试程序去调用这个动态库

在这里插入图片描述

2、编译库文件
test.c 文件
/***test.c****/

#include "test.h"

//ASCII码转成字符abcd...
void itoa(int *num)
{
    if(*num >= 65 && *num <= 90)
    {
        *num = *num - 65 + 'a';
    }
}

test.h文件:
/****test.h****/

//防止头文件被重复包含
#ifndef __ITOA_H_
#define __ITOA_H_

extern void itoa(int *);

#endif

makefile文件:
# make DEBUG=Enble  就会执行第一个选项,否则执行第二个
ifeq ($(DEBUG),Enable)
        CPPFLAGS = -D_DEBUG -g -Wall
else
        CPPFLAGS = -s
endif

INCS=-I./include
LIBS=./lib
OUTDIR=./bin
TARGET=libtest.so
so:
        gcc $(CPPFLAGS) $(INCS) -fPIC -shared test.c -L$(LIBS) -lm -lrt -lpthread -ldl -o $(OUTDIR)/$(TARGET)

all: so

clean:
        rm $(OUTDIR)/$(TARGET)
~

注意: gcc -fPIC -shared test.c -o libtest.so 这条命令是编译成动态库的

之后编译出来的libtest.so 生成在bin目录下,至此,动态库就编译出来了,接下来写个测试程序去调用,先将其拷贝到APP目录的lib 下,然后将test.h 拷贝到APP 目录下的include下。如果想调用一个别人的库,是需要别人提供编译好的库文件和头文件的。

3、编写测试程序调用动态库 libtest.so
main.c 文件
#include<stdio.h>
#include"test.h"

void main()
{
  int b;
  printf("Please input ASCII value(65 ~ 90): ");
  scanf("%d",&b);

  itoa(&b);  //调用libtest.so库里的itoa函数

  printf("The convert char is: %s\n",&b);

}
Makefile 文件:
ifeq ($(DEBUG),Enable)
       CPPFLAGS = -D_DEBUG -g -Wall
else
       CPPFLAGS = -s
endif

INCS=-I./include
LIBS=./lib
OUTDIR=./bin
TARGET=Test

exe:
        gcc $(CPPFLAGS) $(INCS) ./*.c -L$(LIBS)  -ltest  -lm -lrt -lpthread -ldl -o $(OUTDIR)/$(TARGET)
all: exe

clean:
        rm $(OUTDIR)/$(TARGET)

执行make 后生成的测试程序保存在bin目录下

run.sh 文件

需要导出库目录

#!/bin/sh
export LD_LIBRARY_PATH=./lib
echo "Set LD_LIBRARY_PATH = "$LD_LIBRARY_PATH
./bin/Test

这时候执行 ./run.sh 命令即可实现测试程序调用动态库,库里边是具体函数的实现,测试程序去调用。
在这里插入图片描述
有一个命令挺好用的:readelf -d Test ,可以查看你编译出来的可执行程序依赖哪些库,从下图可以看出测试程序Test 依赖 libtest.so 这个动态库(共享库)了。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值