linux 静态库,makefile
Posted master-dragon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 静态库,makefile相关的知识,希望对你有一定的参考价值。
mkdir testlib,组织文件目录如下
my_math.h
int add(int a, int b);
int subtract(int a, int b);
my_math.c
#include "../include/my_math.h"
int add(int a, int b)
{
return a + b;
}
int subtract(int a, int b)
{
return a - b;
}
my_print.h
#include <stdio.h>
void cout(const char * message);
my_print.c
#include "../include/my_print.h"
void cout(const char * message)
{
fprintf(stdout, "%s\\n", message);
}
mylib.h
#ifndef __MY_LIB_H__
#define __MY_LIB_H__
int add(int a, int b);
int subtract(int a, int b);
void cout(const char *);
#endif
有以上文件 生成 libmylib.a
编写测试文件test.c,引用libmylib.atest.c
#include <stdio.h>
#include "my_lib.h"
int main(void)
{
int c = add(15, -21);
cout("I am a func from mylib ...");
printf("%d\\n",c);
return 0;
}
makefile
# 静态库的使用
#
# make build 生成 libmylib.a
# make test 生成a.out可执行文件
# make clean 清除相关文件
#
.PHONY: build test clean
CC=gcc
OBJ_DIR=./obj
LIB_DIR=./lib
HEADERS=-I./include
DEBUG=-g -ggdb
WALL=-Wall -W
CFLAGS=$(WALL) $(DEBUG)
LIB_CC=$(CC) $(CFLAGS) $(HEADERS)
LIB_OBJ = $(addprefix $(OBJ_DIR)/, my_math.o my_print.o)
# 目录的判断与创建
prepare:
@-if [ ! -d $(OBJ_DIR) ];then mkdir $(OBJ_DIR); fi
@-if [ ! -d $(LIB_DIR) ];then mkdir $(LIB_DIR); fi
build:prepare $(LIB_DIR)/libmylib.a
# 使用ar链接生成静态库
$(LIB_DIR)/libmylib.a:$(LIB_OBJ)
ar -crv $@ $^
$(OBJ_DIR)/%.o:src/%.c
$(LIB_CC) -c $< -o $@
# 使用静态库
test:a.out
a.out:test.c
$(LIB_CC) test.c -L$(LIB_DIR) -lmylib
clean:
rm -rf $(OBJ_DIR)
rm $(LIB_DIR)/libmylib.a
rm a.out
makefile相关命令:
makefile中的.PHONY: http://blog.163.com/yangfan876@126/blog/static/80612456201371255834418/
shell的addprefix:
http://blog.csdn.net/cjsycyl/article/details/8064958
以上是关于linux 静态库,makefile的主要内容,如果未能解决你的问题,请参考以下文章
Linux2.6 如何编写Makefile,使驱动程序能够编译链接静态库