Mac OS下安装ProtocolBuffer与iOS的简单使用

转自:http://www.th7.cn/Program/IOS/201506/484001.shtml

首先是怎么安装Protobuf。 来自https://github.com/alexeyxo/protobuf-objc的文档。

打开终端!

brew -v

查看你的mac里面有没有装brew。brew是mac os里面,类似于ubuntu的apt-get的功能,都可以直接在终端输入命令然后安装程序。-v自然就是版本version的意思

ruby -e $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)

这一句半懂不懂,大概就是利用curl工具访问那个url,然后在ruby环境下载安装brew

建议先去Homebrew官网找最新的下载地址

brew install automake

brew install libtool

brew install protobuf

就是利用brew下载安装了。protobuf就是我们想要的,另外两个是依赖库

git clone https://github.com/alexeyxo/protobuf-objc.git

./build.sh

从github下载protobuf-objc这个工程,build脚本里面做的是编译。

我建议不要用 ./build.sh ,我安装过程中发现未知错误最终没有进行下去。哎,好失败。懂脚本的朋友可以尝试下。

到此,我们先得感谢 http://www.2cto.com/kf/201503/382440.html的文章作者。点开链接的朋友会发现,这都什么吗,明显照抄人家的。。。

我只能说,该作者前半部分解释的非常好,我是超越不了了,只能完全借用了。其实说白了,就是懒。言归正传:

当我们 git clone https://github.com/alexeyxo/protobuf-objc.git 完成后,

cd ~/protobuf-objc

./autogen.sh

./configure

~/protobuf-objc其实就是刚刚clone的文件目录

进行./configure 可能会报错,不过别着急,先分析错误信息

configure: error:

ERROR: protobuf headers are required.

You must either install protobuf from google,

or if you have it installed in a custom location

you must add '-Iincludedir' to CXXFLAGS

and '-Llibdir' to LDFLAGS.

If you did not specify a prefix when installing

protobuf, try

'./configure CXXFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib'

In some 64-bit environments, try LDFLAGS=-L/usr/local/lib64.

仔细看,不难发现终端给出了解决办法,我想这应该是跟系统是不是64位有关吧(个人猜测)。

./configure CXXFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib

运行通过后,

make

make install

最终生成的插件名字为protoc-gen-objc,会被安装到/usr/local/bin/目录下。

你可以

cd /usr/local/bin/

ls -a

按照我的方法,肯定能看见protoc-gen-objc。

一切准备就绪,我们来测试下。

在桌面创建一个 ProtoBuf的文件夹。然后

cd ~/Desktop/ProtoBuf

touch person.proto

vi person.proto

就按ProtocolBuffer的语法规则简单建立一个.proto的文件

package csdnblog;

message PBUser {

required string userId = 1;

optional string nick = 2;

optional string avatar = 3;

}

创建完毕后,我们来编译这个person.proto文件。cd到ProtoBuf的文件夹后,命令如下:

protoc --plugin=/usr/local/bin/protoc-gen-objc person.proto --objc_out=./

protoc会自动在/usr/local/bin/目录下寻找名为”protoc-gen-objc”的插件,并使用该插件编译.proto文件,最终生成两个文件:

Person.pb.h

Person.pb.m

这个步骤通过后,说明ProtocoBuffer Compiler for Objective-C可以正常工作了。

现在我们可以在Xcode中使用ProtocolBuffer

打开Xcode!新建一个ProtoBuffer工程! 然后有两个方法把protobuf添加到你的工程里面,一个是直接添加,一个是利用CocoaPods 强烈推荐后者,因为cocoapods能够很方便管理第三方类库,以后人家的工程升级了,你只需要一行 pod update 就ok了。顺便打个广告:CocoaPods的强大,不用不知道,一用吓一跳

关于安装和使用cocoapods,属于另一个话题,看另一个博文。

我的cocoapods 版本是0.36  我的Podfile文件如下:

source 'https://gitcafe.com/akuandev/Specs.git'

# platform :ios, '7.0'

target "ProtoBuffer" do

pod "ProtocolBuffers", "~> 1.9.7"

end

在保存之后,到终端,cd到工程里面,

pod install

完成后,将前面编译的 Person.pb.h和Person.pb.m导入工程中,到此你就可以使用了。

提示:~/protobuf-objc文件里有一个 iOS的栗子哦,有兴趣的朋友可以研究下哦。

注:“source 'https://gitcafe.com/akuandev/Specs.git'”  我这个cocoapods使用了一个叫akinliu在gitcafe上建立的CocoaPods索引库的镜像。因为gitcafe是国内的服务器,所以会快很多。

如下操作可以将CocoaPods设置成使用gitcafe镜像:

pod repo remove master

pod repo add master https://gitcafe.com/akuandev/Specs.git

pod repo update

Either you, or somebody else, appears to have edited theautogen.shscript to directly run/Library/Developer/CommandLineTools/usr/bin/libtoolor made some other change to cause it to run that script; this was the Wrong Thing To Do, as that's the OS X libtool, and that ismostdefinitelyNOTthe libtool that Wireshark wants.

what do I need to do to fix it?

undo whatever was done to cause autogen.sh to make it run/Library/Developer/CommandLineTools/usr/bin/libtool;

rename whatever version of libtool you installed (probably/usr/local/bin/libtool) toglibtool, and rename thelibtoolizein the same directory toglibtoolize, so that it looks just like the GNU libtool that OS X used to provide, and thus so that Wireshark's attempt to use the GNU libtool works.

glibtool系统名称冲突,需要强制命名

本文借鉴了以下两篇博文,非常感谢他们的分享。希望大家可以参考一下:

http://www.2cto.com/kf/201503/382440.html

http://www.cnblogs.com/tara/archive/2012/03/20/2407951.html

chaowudeiMac:desktop chaowu$ git clone https://github.com/qzix/protobuf-objc.git

Cloning into 'protobuf-objc'...

remote: Counting objects: 951, done.

remote: Total 951 (delta 0), reused 0 (delta 0), pack-reused 951

Receiving objects: 100% (951/951), 848.88 KiB | 70.00 KiB/s, done.

Resolving deltas: 100% (551/551), done.

Checking connectivity... done.

chaowudeiMac:desktop chaowu$ cd protobuf-objc

chaowudeiMac:protobuf-objc chaowu$ ls

CREDITS        README.md    configure.ac

Makefile.am    autogen.sh    src

chaowudeiMac:protobuf-objc chaowu$ ./autogen.sh

libtoolize: putting auxiliary files in '.'.

libtoolize: copying file './ltmain.sh'

libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4'.

libtoolize: copying file 'm4/libtool.m4'

libtoolize: copying file 'm4/ltoptions.m4'

libtoolize: copying file 'm4/ltsugar.m4'

libtoolize: copying file 'm4/ltversion.m4'

libtoolize: copying file 'm4/lt~obsolete.m4'

configure.ac:13: installing './compile'

configure.ac:9: installing './config.guess'

configure.ac:9: installing './config.sub'

configure.ac:10: installing './install-sh'

configure.ac:10: installing './missing'

src/compiler/Makefile.am:6: warning: source file 'google/protobuf/objectivec-descriptor.pb.cc' is in a subdirectory,

src/compiler/Makefile.am:6: but option 'subdir-objects' is disabled

automake: warning: possible forward-incompatibility.

automake: At least a source file is in a subdirectory, but the 'subdir-objects'

automake: automake option hasn't been enabled.  For now, the corresponding output

automake: object file(s) will be placed in the top-level directory.  However,

automake: this behaviour will change in future Automake versions: they will

automake: unconditionally cause object files to be placed in the same subdirectory

automake: of the corresponding sources.

automake: You are advised to start using 'subdir-objects' option throughout your

automake: project, to avoid future incompatibilities.

src/compiler/Makefile.am: installing './depcomp'

chaowudeiMac:protobuf-objc chaowu$ ./depcomp

./depcomp: No command.  Try './depcomp --help' for more information.

chaowudeiMac:protobuf-objc chaowu$ ./configure

checking build system type... x86_64-apple-darwin14.1.0

checking host system type... x86_64-apple-darwin14.1.0

checking target system type... x86_64-apple-darwin14.1.0

checking for a BSD-compatible install... /usr/bin/install -c

checking whether build environment is sane... yes

checking for a thread-safe mkdir -p... ./install-sh -c -d

checking for gawk... no

checking for mawk... no

checking for nawk... no

checking for awk... awk

checking whether make sets $(MAKE)... yes

checking whether makesupports nested variables... yes

checking for gcc... gcc

checking whether the C compiler works... yes

checking for C compiler default output file name... a.out

checking for suffix of executables...

checking whether we are cross compiling... no

checking for suffix of object files... o

checking whether we are using the GNU C compiler... yes

checking whether gcc accepts -g... yes

checking for gcc option to accept ISO C89... none needed

checking whether gcc understands -c and -o together... yes

checking for style of include used by make... GNU

checking dependency style of gcc... gcc3

checking for g++... g++

checking whether we are using the GNU C++ compiler... yes

checking whether g++ accepts -g... yes

checking dependency style of g++... gcc3

checking C++ compilerflags...... use default: -g -O2 -DNDEBUG

checking how to print strings... printf

checking for a sed that does not truncate output... /usr/bin/sed

checking for grep that handles longlines and -e... /usr/bin/grep

checking for egrep... /usr/bin/grep -E

checking for fgrep... /usr/bin/grep -F

checking for ld used by gcc... /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld

checking if the linker (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld) is GNU ld... no

checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm

checking the name lister (/usr/bin/nm) interface... BSD nm

checking whether ln -s works... yes

checking the maximum length of commandlinearguments... 196608

checking how to convert x86_64-apple-darwin14.1.0 file names to x86_64-apple-darwin14.1.0 format... func_convert_file_noop

checking how to convert x86_64-apple-darwin14.1.0 file names to toolchain format... func_convert_file_noop

checking for /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld option to reload object files... -r

checking for objdump... no

checking how to recognize dependent libraries... pass_all

checking for dlltool... no

checking how to associate runtime and link libraries... printf %s/n

checking for ar... ar

checking for archiver @FILEsupport... no

checking for strip... strip

checking for ranlib... ranlib

checking command to parse /usr/bin/nm output from gcc object... ok

checking for sysroot... no

checking for a working dd... /bin/dd

checking how to truncate binary pipes... /bin/dd bs=4096 count=1

checking for mt... no

checking if : is a manifest tool... no

checking for dsymutil... dsymutil

checking for nmedit... nmedit

checking for lipo... lipo

checking for otool... otool

checking for otool64... no

checking for -single_module linker flag... yes

checking for -exported_symbols_list linker flag... yes

checking for -force_load linkerflag... yes

checking how to run the C preprocessor... gcc -E

checking for ANSI C header files... yes

checking for sys/types.h... yes

checking for sys/stat.h... yes

checking for stdlib.h... yes

checking for string.h... yes

checking for memory.h... yes

checking for strings.h... yes

checking for inttypes.h... yes

checking for stdint.h... yes

checking for unistd.h... yes

checking for dlfcn.h... yes

checking for objdir... .libs

checking if gcc supports -fno-rtti -fno-exceptions... yes

checking for gcc option to produce PIC... -fno-common -DPIC

checking if gcc PIC flag -fno-common -DPIC works... yes

checking if gcc staticflag-static works... no

checking if gccsupports -c -o file.o... yes

checking if gcc supports -c -o file.o... (cached) yes

checking whether the gcc linker (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld) supports shared libraries... yes

checking dynamic linker characteristics... darwin14.1.0 dyld

checking how to hardcode library paths into programs... immediate

checking whether stripping libraries is possible... yes

checking if libtoolsupports shared libraries... yes

checking whether to build shared libraries... yes

checking whether to build static libraries... yes

checking how to run the C++ preprocessor... g++ -E

checking for ld used by g++... /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld

checking if the linker (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld) is GNU ld... no

checking whether the g++ linker (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld)supports shared libraries... yes

checking for g++ option to produce PIC... -fno-common -DPIC

checking if g++ PIC flag -fno-common -DPIC works... yes

checking if g++ staticflag-static works... no

checking if g++ supports -c -o file.o... yes

checking if g++ supports -c -o file.o... (cached) yes

checking whether the g++ linker (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld)supports shared libraries... yes

checking dynamic linker characteristics... darwin14.1.0 dyld

checking how to hardcode library paths into programs... immediate

checking for ANSI C header files... (cached) yes

checking fcntl.h usability... yes

checking fcntl.h presence... yes

checking for fcntl.h... yes

checking for inttypes.h... (cached) yes

checking limits.h usability... yes

checking limits.h presence... yes

checking for limits.h... yes

checking for stdlib.h... (cached) yes

checking for unistd.h... (cached) yes

checking for working memcmp... yes

checking for working strtod... yes

checking for ftruncate... yes

checking for memset... yes

checking for mkdir... yes

checking for strchr... yes

checking for strerror... yes

checking for strtol... yes

checking google/protobuf/stubs/common.h usability... yes

checking google/protobuf/stubs/common.h presence... yes

checking for google/protobuf/stubs/common.h... yes

checking that generated files are newer than configure... done

configure: creating ./config.status

config.status: creating Makefile

config.status: creating src/compiler/Makefile

config.status: creating config.h

config.status: executing depfiles commands

config.status: executing libtool commands

chaowudeiMac:protobuf-objc chaowu$ make

/Applications/Xcode.app/Contents/Developer/usr/bin/make  all-recursive

Making all in src/compiler

g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cc

mv -f .deps/main.Tpo .deps/main.Po

g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_enum_field.o -MD -MP -MF .deps/objc_enum_field.Tpo -c -o objc_enum_field.o objc_enum_field.cc

mv -f .deps/objc_enum_field.Tpo .deps/objc_enum_field.Po

g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_file.o -MD -MP -MF .deps/objc_file.Tpo -c -o objc_file.o objc_file.cc

mv -f .deps/objc_file.Tpo .deps/objc_file.Po

g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_message_field.o -MD -MP -MF .deps/objc_message_field.Tpo -c -o objc_message_field.o objc_message_field.cc

mv -f .deps/objc_message_field.Tpo .deps/objc_message_field.Po

g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_enum.o -MD -MP -MF .deps/objc_enum.Tpo -c -o objc_enum.o objc_enum.cc

mv -f .deps/objc_enum.Tpo .deps/objc_enum.Po

g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_generator.o -MD -MP -MF .deps/objc_generator.Tpo -c -o objc_generator.o objc_generator.cc

mv -f .deps/objc_generator.Tpo .deps/objc_generator.Po

g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_primitive_field.o -MD -MP -MF .deps/objc_primitive_field.Tpo -c -o objc_primitive_field.o objc_primitive_field.cc

mv -f .deps/objc_primitive_field.Tpo .deps/objc_primitive_field.Po

g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_extension.o -MD -MP -MF .deps/objc_extension.Tpo -c -o objc_extension.o objc_extension.cc

mv -f .deps/objc_extension.Tpo .deps/objc_extension.Po

g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_helpers.o -MD -MP -MF .deps/objc_helpers.Tpo -c -o objc_helpers.o objc_helpers.cc

objc_helpers.cc:363:13: warning: enumeration values 'OBJECTIVECTYPE_STRING',

'OBJECTIVECTYPE_DATA', and 'OBJECTIVECTYPE_MESSAGE' not handled in switch

[-Wswitch]

switch (type) {

^

objc_helpers.cc:423:13: warning: enumeration values 'OBJECTIVECTYPE_STRING',

'OBJECTIVECTYPE_DATA', and 'OBJECTIVECTYPE_MESSAGE' not handled in switch

[-Wswitch]

switch(GetObjectiveCType(field)) {

^

2 warnings generated.

mv -f .deps/objc_helpers.Tpo .deps/objc_helpers.Po

g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_field.o -MD -MP -MF .deps/objc_field.Tpo -c -o objc_field.o objc_field.cc

mv -f .deps/objc_field.Tpo .deps/objc_field.Po

g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_message.o -MD -MP -MF .deps/objc_message.Tpo -c -o objc_message.o objc_message.cc

mv -f .deps/objc_message.Tpo .deps/objc_message.Po

g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objectivec-descriptor.pb.o -MD -MP -MF .deps/objectivec-descriptor.pb.Tpo -c -o objectivec-descriptor.pb.o `test -f 'google/protobuf/objectivec-descriptor.pb.cc' || echo './'`google/protobuf/objectivec-descriptor.pb.cc

mv -f .deps/objectivec-descriptor.pb.Tpo .deps/objectivec-descriptor.pb.Po

/bin/sh ../../libtool  --tag=CXX   --mode=link g++  -g -O2 -DNDEBUG -lprotobuf -lprotoc  -o protoc-gen-objc main.o objc_enum_field.o objc_file.o objc_message_field.o objc_enum.o objc_generator.o objc_primitive_field.o objc_extension.o objc_helpers.o objc_field.o objc_message.o objectivec-descriptor.pb.o

libtool: link: g++ -g -O2 -DNDEBUG -o protoc-gen-objc main.o objc_enum_field.o objc_file.o objc_message_field.o objc_enum.o objc_generator.o objc_primitive_field.o objc_extension.o objc_helpers.o objc_field.o objc_message.o objectivec-descriptor.pb.o -Wl,-bind_at_load  -lprotobuf -lprotoc

make[2]: Nothing to be done for `all-am'.

chaowudeiMac:protobuf-objc chaowu$ make install

Making install in src/compiler

../.././install-sh -c -d '/usr/local/bin'

/bin/sh ../../libtool   --mode=install /usr/bin/install -c protoc-gen-objc '/usr/local/bin'

libtool: install: /usr/bin/install -c protoc-gen-objc /usr/local/bin/protoc-gen-objc

make[2]: Nothing to be done for `install-data-am'.

make[2]: Nothing to be done for `install-exec-am'.

make[2]: Nothing to be done for `install-data-am'.

chaowudeiMac:protobuf-objc chaowu$ cd ..

chaowudeiMac:desktop chaowu$ protoc --proto_path=. --objc_out=. im.msg.proto

im.msg.proto: No such file or directory

chaowudeiMac:desktop chaowu$ protoc --proto_path=. --objc_out=. im_msg.proto

chaowudeiMac:desktop chaowu$  protoc --proto_path=. --objc_out=. im_msg.proto

chaowudeiMac:desktop chaowu$

首先,打开终端!

?

1

brew -v

:查看你的mac里面有没有装brew。brew是mac os里面,类似于ubuntu的apt-get的功能,都可以直接在终端输入命令然后安装程序。-v自然就是版本version的意思

?

1

ruby -e $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)

这一句半懂不懂,,大概就是利用curl工具访问那个url,然后在ruby环境下载安装brew

?

123

brew install automakebrew install libtoolbrew install protobuf

Homebrew 的使用方法也很简单。

基本用法

brew search formula # 搜索软件包

brew install formula # 安装软件包

brew remove formula # 移除软件包

brew cleanup formula # 清除旧包

brew list # 列出已安装的软件包

brew update # 更新 Homebrew

brew upgrade # 升级软件包

brew home formula # 用浏览器打开

brew info formula # 显示软件内容信息

brew deps formula # 显示包的依赖

brew server # 启动 web 服务器,可以通过浏览器访问 http://localhost:4567 来通过网页来管理包

brew -h # 帮助

brew versions formula # 列出软件包的版本

4.新建一个工程,将生成的personOC版的文件导入,然后将ProtocolBuffers-2.2.0-Source/objectivec下的文件放到项目的目录下,创建一个ProtobufLib文件夹,放进去,最好放在一个文件夹下面像这样


1 message Person { 2 required string name = 1; 3 required int32 id = 2; 4 optional string email = 3; 56 enum PhoneType { 7 MOBILE = 0; 8 HOME = 1; 9 WORK = 2;10 }11 12 message PhoneNumber {13 required string number = 1;14 optional PhoneType type = 2 [default = HOME];15 }16 17 repeated PhoneNumber phone = 4;18 }

B.在ProtocolBuffers-2.2.0-Source下创建这样一个子目录build/objc以便存放我们生成的classes

现在执行命令:

src/protoc --proto_path=src --objc_out=build/objc src/Person.proto

成功后会在build/objc下生成Person.pd.h 和 Person.pb.m 两个Object-C文件

3、测试

A.新建一个项目ProtobufDemo,将刚才生成的两个文件加入项目。然后将ProtocolBuffers-2.2.0-Source/objectivec 下的文件放到项目的目录下,最好放在一个文件夹下面像这样


创建一个ProtobufLib文件夹,放进去.

B.之后把ProtocolBuffers.xcodeproj添加到项目中,我习惯将它放到Frameworks下。

C.然后双击Targets下的ProtobufDemo,点击+添加,之后做一些配置,like this


在.pch文件中导入 #import "ProtocolBuffers.h"

配置好这些之后编译你的项目,应该不会报错了吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容