linux 下的C动态库编写

来源:互联网 发布:去痘印面膜 知乎 编辑:程序博客网 时间:2024/05/16 01:28

动态库的本质是一个.c 文件 ,里面封装了一部分相关的函数,经过已编译指令生成动态库;

base.c 文件内容:

#include <stdio.h>#include <stdlib.h>#include <string.h>void ch_to_base64(char src[]){char Base[65]={};strcpy(Base,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");char dest[64]={};int s_len=strlen(src);int remainder = s_len%3;int times = (s_len-remainder)/3;int pos = 0;int i = 0,j = 0;int parr[5];while(times){unsigned int tmp1 = (unsigned int) src[pos++];unsigned int tmp2 = (unsigned int) src[pos++];unsigned int tmp3 = (unsigned int) src[pos++];parr[0] = tmp1>>2;parr[1] = ((tmp1-(tmp1>>2<<2))<<4) + (tmp2>>4);parr[2] = ((tmp2-(tmp2>>4<<4))<<2) +(tmp3>>6);parr[3] = tmp3-(tmp3>>6<<6);for(i,j=0;j<4;i++,j++){dest[i] = Base[parr[j]];}times--;}if(remainder == 1){unsigned int re1 = (unsigned int)src[pos];if((re1&3) == 0) {parr[0] = re1>>2;dest[i++]=Base[parr[0]];dest[i++]=Base[0];dest[i++]='=';dest[i++]='=';}else{parr[0] = re1>>2;parr[1] = (re1&3)<<4;dest[i++]=Base[parr[0]];dest[i++]=Base[parr[1]];dest[i++]='=';dest[i++]='=';}}if(remainder == 2){unsigned int re1 = (unsigned int)src[pos++];unsigned int re2 = (unsigned int)src[pos];if((re2&15) == 0){parr[0] = re1>>2;parr[1] = ((re1 - (re1>>2<<2))<<4) + (re2>>4);dest[i++]=Base[parr[0]];dest[i++]=Base[parr[1]];dest[i++]=Base[0];dest[i++]='=';}else{parr[0] = re1>>2;parr[1] = ((re1 - (re1>>2<<2))<<4) + (re2>>4);parr[2] = (re2-(re2>>4<<4))<<2 ;dest[i++] = Base[parr[0]];dest[i++] = Base[parr[1]];dest[i++] = Base[parr[2]];dest[i++]='=';}}strcpy(src,dest);}


main.c 代码:

#include <stdio.h>#include <stdlib.h>#include <string.h>int main(int argc,char **argv){if(argc !=2) {printf("error: param num is wrong!\n");return -1;}ch_to_base64(argv[1]);printf("buf = %s\n",argv[1]);}


动态库的命名规范:lib().so   括号的内容是动态库的名称,前面必须有lib,后面必须有.so


生成动态库:

gcc  -fpic  -shared  base.c -olibbase64.so

将生成的动态库文件移动到系统库目录下

mv  ./libbase64.so  /lib64/

编译main.c

gcc  main.c -o main  -lbase64

运行main

./main  pp

运行结果:



0 0
原创粉丝点击