文件目錄:
my_library
|_inc
|_mylib.h
|_src
|_mylib_func.c
|_mylib_system.c
|_lib
|_編譯生成目標
Makefile
Makefile
# build libraries
#CC=
#AR=
#LD=
BUILDPATH=$(shell pwd)
LIBPATH=$(BUILDPATH)/lib
LIB_STATIC=1
#1:static 2:shared
CFLAGS = -Wall
CFLAGS = -I$(BUILDPATH)/inc
ifeq ($(LIB_STATIC),1)
TARGET := $(LIBPATH)/libmylib.a
CFLAGS += -fPIC
else
TARGET := $(LIBPATH)/libmylib.so
CFLAGS += -fPIC -fno-stack-protector
endif
LIBSRC = \
src/mylib_func.c \
src/mylib_system.c
LIBOBJ = $(addprefix $(BUILDPATH)/, $(addsuffix .o ,$(basename $(LIBSRC))))
.PHONY: all clean install
all: $(TARGET)
$(BUILDPATH)/%.o:%.c
$(CC) $(CFLAGS) -o $@ -c $<
ifeq ($(LIB_STATIC),1)
$(TARGET):$(LIBOBJ)
$(AR) -crs $@ $^
else
$(TARGET):$(LIBOBJ)
$(LD) -o $@ $^ -O3 -fPIC -shared
endif
clean:
$(RM) $(LIBOBJ)
$(RM) $(LIBPATH)/*
@echo ""
install:
@echo ""
mylib.h
#ifndef __MYLIB_H__
#define __MYLIB_H__
int mylib_load(const char *path);
int mylib_release(void *param);
int mylib_config_get(void);
#endif //__MYLIB_H__
mylib_func.c
#include <stdio.h>
#include <stdlib.h>
#include "mylib.h"
int mylib_config_get(void)
{
printf("%s",__func__);
return 0;
}
mylib_system.c
// system
#include <stdio.h>
#include <stdlib.h>
// users
#include "mylib.h"
int mylib_load(const char *path)
{
if (NULL == path) {
printf("libaray path is null.\n");
} else {
printf("to do load libaray:%s\n", path);
}
}
int mylib_release(void *param)
{
printf("%s, param:%s", __func__, param);
}
編譯靜態庫:
gcc -c mylib.c
ar rc libmylib.a mylib.o
gcc -o usehello_static usehello.c libmylib.a
編譯靜態庫:
gcc -fPIC -Wall -g -c libhello.c
gcc -g -shared -Wl,-soname,libhello.so.1.0 -o libhello.so.1.0 libhello.o
ln -sf libhelloso.1.0 libhello.so
gcc -Wall -g -c usehello -o usehello.o
gcc -g -o usehello_dynamic usehello.o -L ./ -lhello //連接引用庫文件