关于leveldb源码整理之一

来源:互联网 发布:尚硅谷大数据视频 编辑:程序博客网 时间:2024/06/10 00:41

前言

最近换工作需要用CPP,不得已学了点,但是越学越觉得难,这里就找到一个简单的源码,自己看下一般编写c、cpp需要注意的细节。当然基本的面相对象的一些特点,以及指针啥的,这里过于基础的就不多说。主要还是自己的总结,这里不是分析源码,这里主要是分析语法。

正文

实在无从下手。看了两天的makefile,这里还是主要介绍下makefile的一些东西吧,里面相对比较复杂的地方是:

# detect what platform we're building on$(shell CC="$(CC)" CXX="$(CXX)" TARGET_OS="$(TARGET_OS)" \    ./build_detect_platform build_config.mk ./)# this file is generated by the previous line to set build flags and sourcesinclude build_config.mk

这里shell其实新开一个shell脚本,传入变量,编译器和操作系统。然后才开始貌似是用子shell,可以共享变量的方法,传入值,这里我们还是看下子shell脚本-build_detect_platform
这个家伙,前面很简单,这里就不详细介绍,我么看最后很有意思。

echo "CC=$CC" >> $OUTPUTecho "CXX=$CXX" >> $OUTPUTecho "PLATFORM=$PLATFORM" >> $OUTPUTecho "PLATFORM_LDFLAGS=$PLATFORM_LDFLAGS" >> $OUTPUTecho "PLATFORM_LIBS=$PLATFORM_LIBS" >> $OUTPUTecho "PLATFORM_CCFLAGS=$PLATFORM_CCFLAGS" >> $OUTPUTecho "PLATFORM_CXXFLAGS=$PLATFORM_CXXFLAGS" >> $OUTPUTecho "PLATFORM_SSEFLAGS=$PLATFORM_SSEFLAGS" >> $OUTPUTecho "PLATFORM_SHARED_CFLAGS=$PLATFORM_SHARED_CFLAGS" >> $OUTPUTecho "PLATFORM_SHARED_EXT=$PLATFORM_SHARED_EXT" >> $OUTPUTecho "PLATFORM_SHARED_LDFLAGS=$PLATFORM_SHARED_LDFLAGS" >> $OUTPUTecho "PLATFORM_SHARED_VERSIONED=$PLATFORM_SHARED_VERSIONED" >> 

这里输出一大堆东西,进入一个,通过>>>将输出写入一个文件,这个就是我们需要 include的一个文件,这里OUTPUT到底是啥,我也说不太清楚,shell脚本暂时不tai懂,反正就是将内容写入到build_config.mk中。
这里我们得到我想要的东西,
我们可以看下这个生成的文件,我这里用的win10下的unbutu子系统:

SOURCES=db/builder.cc db/c.cc db/dbformat.cc db/db_impl.cc db/db_iter.cc db/dumpfile.cc db/filename.cc db/log_reader.cc db/log_writer.cc db/memtable.cc db/repair.cc db/table_cache.cc db/version_edit.cc db/version_set.cc db/write_batch.cc table/block_builder.cc table/block.cc table/filter_block.cc table/format.cc table/iterator.cc table/merger.cc table/table_builder.cc table/table.cc table/two_level_iterator.cc util/arena.cc util/bloom.cc util/cache.cc util/coding.cc util/comparator.cc util/crc32c.cc util/env.cc util/env_posix.cc util/filter_policy.cc util/hash.cc util/histogram.cc util/logging.cc util/options.cc util/status.cc  port/port_posix.cc port/port_posix_sse.ccMEMENV_SOURCES=helpers/memenv/memenv.ccCC=ccCXX=g++PLATFORM=OS_LINUXPLATFORM_LDFLAGS=-pthreadPLATFORM_LIBS=PLATFORM_CCFLAGS= -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENTPLATFORM_CXXFLAGS=-std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENTPLATFORM_SSEFLAGS=-msse4.2 -DLEVELDB_PLATFORM_POSIX_SSEPLATFORM_SHARED_CFLAGS=-fPICPLATFORM_SHARED_EXT=soPLATFORM_SHARED_LDFLAGS=-shared -Wl,-soname -Wl,PLATFORM_SHARED_VERSIONED=true

其实熟悉makefile的童鞋应该就知道,source才是关键,现在得到所有需要的编译的文件,我们换了后缀,就得到了所有的目标文件,这里注意source就可以了。
继续找我们的
终极目标—-all
这是makefile的原则,all的目标就是这个执行make的目标,
很容易找到:

all: $(SHARED_LIBS) $(SHARED_PROGRAMS) $(STATIC_OUTDIR)/libleveldb.a $(STATIC_OUTDIR)/libmemenv.a $(STATIC_PROGRAMS)

是不是觉得很崩溃,这都是啥啊!!我们只要知道,我们还是慢慢的找到这些家伙到底是干啥的,一个一个来,
先找到share_libs,他的生成规则:

# Update db.h if you change these.SHARED_VERSION_MAJOR = 1SHARED_VERSION_MINOR = 20SHARED_LIB1 = libleveldb.$(PLATFORM_SHARED_EXT)SHARED_LIB2 = $(SHARED_LIB1).$(SHARED_VERSION_MAJOR)SHARED_LIB3 = $(SHARED_LIB1).$(SHARED_VERSION_MAJOR).$(SHARED_VERSION_MINOR)SHARED_LIBS = $(SHARED_OUTDIR)/$(SHARED_LIB1) $(SHARED_OUTDIR)/$(SHARED_LIB2) $(SHARED_OUTDIR)/$(SHARED_LIB3)

这里得到的三个目标其实是真个工程的终极目标,这个应该是makefile最后开始编译的步骤。那么我看这个三个目标是啥第一个libleveldb.so,liblevedb.so.1,libleveldb.so.1.2,这里我们就需要找到生成目标的规则了。

$(SHARED_OUTDIR)/$(SHARED_LIB1): $(SHARED_OUTDIR)/$(SHARED_LIB3)    ln -fs $(SHARED_LIB3) $(SHARED_OUTDIR)/$(SHARED_LIB1)$(SHARED_OUTDIR)/$(SHARED_LIB2): $(SHARED_OUTDIR)/$(SHARED_LIB3)    ln -fs $(SHARED_LIB3) $(SHARED_OUTDIR)/$(SHARED_LIB2)SHARED_MEMENVLIB = $(SHARED_OUTDIR)/libmemenv.aendif$(SHARED_OUTDIR)/$(SHARED_LIB3): $(SHARED_LIBOBJECTS)    $(CXX) $(LDFLAGS) $(PLATFORM_SHARED_LDFLAGS)$(SHARED_LIB2) $(SHARED_LIBOBJECTS) -o $(SHARED_OUTDIR)/$(SHARED_LIB3) $(LIBS)

这里很容易发现,前两个都是浮云。第三个才是真正的目标。那么我们就看下第三个目标是如何生成的,
出去flag。和等于空的libs,这里基本就是通过编译SHARED_LIBOBJECTS

SHARED_LIBOBJECTS := $(addprefix $(SHARED_OUTDIR)/, $(SOURCES:.cc=.o))

这里看到了,所有的都是通过编译source中,吧后缀换成.o的文件。
这里还有一个问题,这些.o文件是自动生成的吗?我们还是看下我们的依赖,这些东西在其他地方使用了吗?事实上使用了,另外一个依赖,这里

SHARED_ALLOBJS := $(SHARED_LIBOBJECTS) $(SHARED_MEMENVOBJECTS) $(TESTHARNESS)$(SHARED_ALLOBJS): | SHARED_OBJDIRS$(SHARED_OUTDIR):    mkdir $@$(SHARED_OUTDIR)/db: | $(SHARED_OUTDIR)    mkdir $@$(SHARED_OUTDIR)/helpers/memenv: | $(SHARED_OUTDIR)    mkdir -p $@$(SHARED_OUTDIR)/port: | $(SHARED_OUTDIR)    mkdir $@$(SHARED_OUTDIR)/table: | $(SHARED_OUTDIR)    mkdir $@$(SHARED_OUTDIR)/util: | $(SHARED_OUTDIR)    mkdir $@.PHONY: SHARED_OBJDIRSSHARED_OBJDIRS: \    $(SHARED_OUTDIR)/db \    $(SHARED_OUTDIR)/port \    $(SHARED_OUTDIR)/table \    $(SHARED_OUTDIR)/util \    $(SHARED_OUTDIR)/helpers/memenv

所以说包括我们的SHARED_LIBOBJECTS 这个也是依赖于SHARED_OBJDIRS 这这个依赖是几个目录。关于.o文件如何自己生成的,

$(SIMULATOR_OUTDIR)/%.o: %.cc    xcrun -sdk iphonesimulator $(CXX) $(CXXFLAGS) $(SIMULATOR_CFLAGS) -c $< -o $@$(DEVICE_OUTDIR)/%.o: %.cc    xcrun -sdk iphoneos $(CXX) $(CXXFLAGS) $(DEVICE_CFLAGS) -c $< -o $@$(SIMULATOR_OUTDIR)/%.o: %.c    xcrun -sdk iphonesimulator $(CC) $(CFLAGS) $(SIMULATOR_CFLAGS) -c $< -o $@$(DEVICE_OUTDIR)/%.o: %.c    xcrun -sdk iphoneos $(CC) $(CFLAGS) $(DEVICE_CFLAGS) -c $< -o $@$(STATIC_OUTDIR)/%.o: %.cc    $(CXX) $(CXXFLAGS) -c $< -o $@$(STATIC_OUTDIR)/%.o: %.c    $(CC) $(CFLAGS) -c $< -o $@$(SHARED_OUTDIR)/%.o: %.cc    $(CXX) $(CXXFLAGS) $(PLATFORM_SHARED_CFLAGS) -c $< -o $@$(SHARED_OUTDIR)/%.o: %.c    $(CC) $(CFLAGS) $(PLATFORM_SHARED_CFLAGS) -c $< -o $@$(STATIC_OUTDIR)/port/port_posix_sse.o: port/port_posix_sse.cc    $(CXX) $(CXXFLAGS) $(PLATFORM_SSEFLAGS) -c $< -o $@$(SHARED_OUTDIR)/port/port_posix_sse.o: port/port_posix_sse.cc    $(CXX) $(CXXFLAGS) $(PLATFORM_SHARED_CFLAGS) $(PLATFORM_SSEFLAGS) -c $< -o $@

这里是 关于.o生成的脚本,其他的test得生成,这里就不介绍了都是一个样子,下面是运行make后执行的结果,可以参考makefile的结构。自己参考。

mkdir out-sharedmkdir out-shared/dbmkdir out-shared/portmkdir out-shared/tablemkdir out-shared/utilmkdir -p out-shared/helpers/memenvg++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/builder.cc -o out-shared/db/builder.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/c.cc -o out-shared/db/c.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/dbformat.cc -o out-shared/db/dbformat.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/db_impl.cc -o out-shared/db/db_impl.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/db_iter.cc -o out-shared/db/db_iter.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/dumpfile.cc -o out-shared/db/dumpfile.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/filename.cc -o out-shared/db/filename.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/log_reader.cc -o out-shared/db/log_reader.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/log_writer.cc -o out-shared/db/log_writer.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/memtable.cc -o out-shared/db/memtable.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/repair.cc -o out-shared/db/repair.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/table_cache.cc -o out-shared/db/table_cache.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/version_edit.cc -o out-shared/db/version_edit.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/version_set.cc -o out-shared/db/version_set.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/write_batch.cc -o out-shared/db/write_batch.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/block_builder.cc -o out-shared/table/block_builder.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/block.cc -o out-shared/table/block.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/filter_block.cc -o out-shared/table/filter_block.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/format.cc -o out-shared/table/format.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/iterator.cc -o out-shared/table/iterator.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/merger.cc -o out-shared/table/merger.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/table_builder.cc -o out-shared/table/table_builder.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/table.cc -o out-shared/table/table.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c table/two_level_iterator.cc -o out-shared/table/two_level_iterator.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/arena.cc -o out-shared/util/arena.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/bloom.cc -o out-shared/util/bloom.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/cache.cc -o out-shared/util/cache.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/coding.cc -o out-shared/util/coding.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/comparator.cc -o out-shared/util/comparator.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/crc32c.cc -o out-shared/util/crc32c.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/env.cc -o out-shared/util/env.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/env_posix.cc -o out-shared/util/env_posix.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/filter_policy.cc -o out-shared/util/filter_policy.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/hash.cc -o out-shared/util/hash.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/histogram.cc -o out-shared/util/histogram.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/logging.cc -o out-shared/util/logging.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/options.cc -o out-shared/util/options.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c util/status.cc -o out-shared/util/status.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c port/port_posix.cc -o out-shared/port/port_posix.og++ -I. -I./include -std=c++0x -fno-builtin-memcmp -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -msse4.2 -DLEVELDB_PLATFORM_POSIX_SSE -c port/port_posix_sse.cc -o out-shared/port/port_posix_sse.og++ -pthread -shared -Wl,-soname -Wl,libleveldb.so.1 out-shared/db/builder.o out-shared/db/c.o out-shared/db/dbformat.o out-shared/db/db_impl.o out-shared/db/db_iter.o out-shared/db/dumpfile.o out-shared/db/filename.o out-shared/db/log_reader.o out-shared/db/log_writer.o out-shared/db/memtable.o out-shared/db/repair.o out-shared/db/table_cache.o out-shared/db/version_edit.o out-shared/db/version_set.o out-shared/db/write_batch.o out-shared/table/block_builder.o out-shared/table/block.o out-shared/table/filter_block.o out-shared/table/format.o out-shared/table/iterator.o out-shared/table/merger.o out-shared/table/table_builder.o out-shared/table/table.o out-shared/table/two_level_iterator.o out-shared/util/arena.o out-shared/util/bloom.o out-shared/util/cache.o out-shared/util/coding.o out-shared/util/comparator.o out-shared/util/crc32c.o out-shared/util/env.o out-shared/util/env_posix.o out-shared/util/filter_policy.o out-shared/util/hash.o out-shared/util/histogram.o out-shared/util/logging.o out-shared/util/options.o out-shared/util/status.o out-shared/port/port_posix.o out-shared/port/port_posix_sse.o -o out-shared/libleveldb.so.1.20ln -fs libleveldb.so.1.20 out-shared/libleveldb.soln -fs libleveldb.so.1.20 out-shared/libleveldb.so.1

后记

这里总结了一下makefile的东西,其实里面很多语法我根本不确定,可是大概思路就是这样,以后有需要,要好好看下这方面的,以后总结几篇关于c、cpp语法的博客,希望我可以看完这隔源代码,觉得代码量也不是很多。加油