libtar下载 编译和使用
1.libtar简介
libtar开源库使用C语言编写,可为使用者提供C级别的创建和解压tar包的方法;
2.libtar下载地址
https://repo.or.cz/libtar.git
3.libtar编译
3.1下载源码
通过上述地址下载libtar源码,我下载的是
2013-12-08 Tim Band Added autoconf instructions to READMEmaster commit | commitdiff | tree | snapshot (tar.gz zip)
3.2解压与编译
下载的源码名为libtar-6d0ab4c.tar.gz
本人编译环境为centos 7.6
解压:tar zxvf libtar-6d0ab4c.tar.gz -C /home
cd /home/libtar-6d0ab4c
[root@localhost libtar-6d0ab4c]#autoreconf --force --install
[root@localhost libtar-6d0ab4c]#./configure
[root@localhost libtar-6d0ab4c]#make
/*如果只需要获取静态库不需要安装则不需要进行make install*/
[root@localhost libtar-6d0ab4c]#make install
make之后静态库和动态库就编译出来了,存在于如下目录
[root@localhost .libs]# ls /home/libtar-6d0ab4c/lib/.libs/
append.o dirname.o libtar.a libtar_list.o output.o wrapper.o
basename.o encode.o libtar_hash.o libtar.so strlcpy.o
block.o extract.o libtar.la libtar.so.0 strmode.o
decode.o handle.o libtar.lai libtar.so.0.0.0 util.o
同时也编译出了一个libtar可执行程序,存在于如下目录
[root@localhost libtar]# ls /home/libtar-6d0ab4c/libtar/.libs/
libtar libtar.o
可以使用这个libtar程序进行简单体验。
同时可以进行通过修改/home/libtar-6d0ab4c/libtar/libtar.c文件来进行输出自己的打印来学习libtar的逻辑
4.libtar静态库使用
这里只介绍静态库的使用,动态库就不做过多介绍了
使用静态库时需要libtar.a和头文件libtar.h libtar_listhash.h (头文件存在于/home/libtar-6d0ab4c/lib)
mkdir -p /home/code/libtartest
cd /home/code/libtartest
mkdir include
mkdir -p lib/64 //存储64位libtar.a
mkdir -p lib/32 //存储32位libtar.a
cp /home/libtar-6d0ab4c/lib/.libs/libtar.a ./lib/64 //此处编译出来的libtar.a为64位
cp /home/libtar-6d0ab4c/lib/libtar.h ./include
cp /home/libtar-6d0ab4c/lib/libtar_listhash.h ./include
touch test.c Makefile
vim libtar.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/file.h>
#include <errno.h>
#include "libtar.h"
int main(int argc, char *argv[])
{
int iret = -1;
TAR* ptar_handle = NULL;
if (argc != 2)
{
printf("tartest tar|untar");
exit(-1);
}
// tar
if(0 == strcmp("tar", argv[1]))
{
char* ptar_fname = "tartest.tar";
const char* file1 = "1.txt";
const char* file2 = "2.txt";
iret = tar_open(&ptar_handle, ptar_fname, NULL, O_WRONLY | O_CREAT, 0644, TAR_GNU);
if (-1 == iret)
{
printf("tar_open failed, reason: %s\n", strerror(errno));
exit(-1);
}
tar_append_file(ptar_handle, file1, file1);
tar_append_file(ptar_handle, file2, file2);
tar_append_eof(ptar_handle);
tar_close(ptar_handle);
}
//untar
else if (0 == strcmp("untar", argv[1]))
{
char* ptar_fname = "tartest.tar";
char* savefdir = "test";
iret = tar_open(&ptar_handle, ptar_fname, NULL, O_RDONLY, 0644, TAR_GNU);
if (-1 == iret)
{
printf("tar_open failed, reason: %s\n", strerror(errno));
exit(-1);
}
tar_extract_all(ptar_handle, savefdir);
tar_close(ptar_handle);
}
else
{
printf("tartest tar|untar");
exit(-1);
}
return 0;
}
vim Makefile
CC = gcc
TARGET=tartest
STRIP=strip
CFLAGS = -Wall
CFLAGS += -I./include
PWD=$(shell pwd)
ifeq ($(shell getconf LONG_BIT), 64)
LIBPATH=./lib/64/
else
LIBPATH=./lib/32/
endif
LDFLAGS += $(LIBPATH)libtar.a -ldl -lpthread
SRCS=$(wildcard $(PWD)/*.c)
OBJS=$(patsubst %.c,%.o,$(SRCS))
all: $(OBJS)
$(CC) -m64 $(OBJS) -o $(TARGET) $(LDFLAGS)
clean:
rm -f $(OBJS) $(TARGET)