静态库和动态库的制作

在现实工作中,要实现代码的共享但又不想让别人知道自己的源代码。那我们该怎么做呢?我们可以利用动态库来保护自己写的源代码不被别人窃取。

 

 lib目录文件

  1. makefile
CC=gcc
#用ar命令对目标文件归档(格式为ar -rcs),生成静态库文件
#再次提醒:归档文件名一定要以lib打头 .a结尾。


libtest.a:myalib.o
	ar -rcs libtest.a myalib.o
#编译生成各目标文件*.o:myalib.o
myalib.o:myalib.c myalib.h
	$(CC) -c myalib.c

clean:
	rm *.o *.a *~

 2.myalib.c

#include<stdio.h>

void test()
{
    printf("Helloworld!\n");
    printf("This is Static library test!\n");
    printf("The test() is OK!\n");
}

3.myalib.h

#ifndef MYALIB_H
#define MYALIB_H

#include<stdio.h>

void test();

#endif

test的目录文件

  1. main.c
int main()
{
   test();
   return 0;
}

     2.makefile

CC = gcc

StaticLibTest:main.o
	#$(CC) -o  StaticLibTest -L /home/win/AppTest/TestStaticLib/lib main.o -ltest
	$(CC) -o  StaticLibTest -L ../lib main.o -ltest

main.o:main.c
	#$(CC) -I /home/win/AppTest/TestStaticLib/lib -c main.c
	$(CC) -I ../lib -c main.c

clean:
	rm *.o StaticLibTest *~

执行make得到库文件

 执行可执行文件

 动态库制作

代码如下:

/************************ libinterface.h *************************/

#ifndef LIBINTERFACE_H
#define LIBINTERFACE_H

typedef struct
{
        int year;
        int mon;
        int day;
}date_type_t;


typedef struct
{
        char hour;
        char min;
        char sec;
}time_type_t;


int gettime(time_type_t *t);
int example(int select);
int getdate(date_type_t *d);


#endif

 



/********************* makefile ********************/

CC=gcc

OBJS=gettime.c example.c getdate.c

REAL_NAME=libinterface.so.1.0
SO_NAME=libinterface.so.1
LINK_NAME=libinterface.so

INC_DIR=/home/win/AppTest/lib_example  //这里是要进行更换的
LIB_DIR=/usr/lib

libinterface.so.1.0:
        $(CC) -fpic -shared -Wl,-soname,$(SO_NAME) -o $(REAL_NAME) $(OBJS) -I$(INC_DIR)

install:
        ln -s $(REAL_NAME) $(LINK_NAME)

        rm -f $(LIB_DIR)/$(SO_NAME)
        ln -s $(REAL_NAME) $(LIB_DIR)/$(SO_NAME)

        rm -f $(LIB_DIR)/$(LINK_NAME)
        cp $(REAL_NAME) $(LIB_DIR)

clean:
        rm *.o   *.so    *.so.*.*   *~

 

/***************************** main *********************************/

#include <stdio.h>
#include <stdlib.h>

#include "../libinterface.h"
int main()
{
        int nret=1;
        date_type_t  d;
        time_type_t  t;
        puts("动态链接库应用示范");

        nret=getdate(&d);
        if(nret)
                printf("getdate() Function Call Failed!\n");
        else
                printf("当前日期:%04d-%02d-%02d\n",d.year,d.mon,d.day);

        nret=gettime(&t);
        if(nret)
                printf("gettime() Function Call Failed!\n");
        else
                printf("当前时间:%02d-%02d-%02d\n",t.hour,t.min,t.sec);

        nret=example(2);
        return 0;
}
/*********************test里面的makefile*******************/

CC = gcc
#程序运行时共享库的查找路径
LIB_DIR = /usr/lib
#LIB_DIR = /home/win/AppTest/lib_example
#库(linker-name)文件、库头文件编译时路径


INC_DIR = /home/win/AppTest/lib_example   //要进行替换 


# -L 目录作为第一个寻找库文件(linker-name)的目录-L$(INC_DIR)
# -lworld 表示在-L$(INC_DIR)下寻找 libworld.so 动态库文件(linker-name)
# gcc 加入链接参数“-Wl,-rpath”指定动态库(so-name,real-name)运行时搜索路径
main: main.o
        $(CC) -Wl,-rpath,$(LIB_DIR) main.o -o main -L$(INC_DIR) -linterface
# libinterface.h is in the direction /home/liangyan/AppTest/lib_example
# -I 目录作为第一个寻找头文件的目录
main.o:
        $(CC) -c main.c -o main.o -I$(INC_DIR)
clean:
        rm *.o  *~  main

执行makefile

 

注意:一定要改正makefile中的路径

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值