在现实工作中,要实现代码的共享但又不想让别人知道自己的源代码。那我们该怎么做呢?我们可以利用动态库来保护自己写的源代码不被别人窃取。
lib目录文件
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
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
void test();
#endif
test的目录文件
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
#include
#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中的路径