Linux C源文件編譯動態庫靜態庫

文件目錄:

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 //連接引用庫文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章