工程目录
—MyProject
———Include
——————leveldb
—————————-*.h //leveldb库的所有头文件
———Libs
————-*.a
———Src
————-*.cpp
———Makefile
Makefile
以下makefile由网上万能makefile修改而来。
EXECUTABLE := magic#可执行文件名
LIBDIR := ./Libs#静态库目录
LIBS := libleveldb.a#静态库文件名
INCLUDES := ./Include/#头文件目录
SRCDIR := ./Src#除了当前目录外,其他源文件目录
###############= := ?= += ###############
# := 像是C里的赋值; = 像是C里的引用; ?= 如果没有被赋值过就赋予等号后边的值;
#example1
#A := foo
#B := $(A)
#A := bar
#这时B的值仍为foo
#example2
#A = foo
#B = $(A)
#A = bar
#这时B的值为bar
#make会将整个makefile展开后,再决定变量的值,也就是说变量的值将会是整个makefile中最后被指定的值。
#########################################
CC := g++
CFLAGS := -g -Wall -o3
CPPFLAGS := $(CFLAGS)
CPPFLAGS += $(addprefix -I,$(INCLUDES))
###########addprefix#####################
#字面意思,添加前缀
#为$(INCLUDES)的所有路径加上前缀 -I
#########################################
#CPPFLAGS += -MMD #生成依赖文件*.d
RM := rm -f
########wildcard函数列举当前目录中扩展名为*.cpp的所有文件
SRCS := $(wildcard *.cpp) $(wildcard $(addsuffix /*.cpp, $(SRCDIR)))
#######
OBJS := $(patsubst %.cpp,%.o,$(SRCS))
###########patsubst 匹配替代的意思,将SRCS中找到的所有.cpp结尾的文件,然后把所有的.cpp换成.o
#DEPS := $(patsubst %.o,%.d,$(OBJS))
##############隐含规则###################
#$(EXECUTABLE)依赖于$(OBJS),但是makefile中没有指明$(OBJS)依赖谁,也没有命令生成他们
#这时make的隐含规则开始起作用;针对$(OBJS)中的每个目标,make自动调用
#$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@
#生成*.o文件
#$< 表示依赖文件列表的第一个文件名
#$@ 表示目标文件名
#########################################
.PHONY : all deps objs clean veryclean rebuild info
all : $(EXECUTABLE)
deps : $(DEPS)
objs : $(OBJS)
clean :
@$(RM) $(OBJS)
$(EXECUTABLE) : $(OBJS)
$(CC) -o $(EXECUTABLE) $(OBJS) $(addprefix $(LIBDIR)/,$(LIBS)) -lpthread
info :
@echo $(SRCS)
@echo $(OBJS)
测试
Main.cpp
#include <assert.h>
#include <iostream>
#include "leveldb/db.h"
int main (int argc,char * argv[])
{
leveldb::DB* db;
leveldb::Options options;
options.create_if_missing = true;
std::string dbpath = "testdb";
leveldb::Status status = leveldb::DB::Open (options, dbpath, &db);
assert (status.ok ());
std::string key = "test";
std::string val = "test_value";
status = db->Put (leveldb::WriteOptions (), key, val);
val.clear ();
status = db->Get (leveldb::ReadOptions (), key, &val);
std::cout << key << ": " << val << std::endl;
return 0;
}