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 这个动态库(共享库)了。