libtar编译和使用

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) 
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值