macOS下从零开始编译ffmpeg

1. FFMpeg 编译选项:

./configure --as=yasm --enable-nonfree --enable-shared --disable-static --enable-ffplay --enable-gpl --enable-pthreads --enable-postproc --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-libspeex --enable-bzlib --enable-zlib --enable-libsnappy --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-version3 --enable-libfdk-aac --enable-libvpx --enable-encoder=pcm_mulaw --enable-encoder=flac --enable-libgsm --enable-libopus --enable-fontconfig --enable-libfreetype --enable-libass --enable-libbluray --enable-filters --extra-cflags=-mmacosx-version-min=10.9 --extra-ldflags=-mmacosx-version-min=10.9

注意编译选项:

--extra-cflags=-mmacosx-version-min=10.9 --extra-ldflags=-mmacosx-version-min=10.9

在 macOS 上编译需要注意这个选项,指定编译库兼容的最低系统版本,编译其他依赖库(动态库)的时候也需要指定,因为编译出来的动态库如果需要打包到app并发布到AppStore, 必须指定这个,如果不指定,无法上传到Appstore。报如下错误:

Couldn't find platform family in Info.plist CFBundleSupportedPlatforms or Mach-O LC_VERSION_MIN for libass.9.dylib

如果成功编译,使用 otool -l *.dylib 命令查看 load command 8 :

Load command 8
      cmd LC_VERSION_MIN_MACOSX
  cmdsize 16
  version 10.9
      sdk 10.14

如果没有成功指定最低兼容版本就是下面这样:

Load command 8
       cmd LC_BUILD_VERSION
   cmdsize 32
  platform macos
       sdk 10.14
     minos 10.14
    ntools 1
      tool ld
   version 409.12

这点在macOS上编译很重要,尤其在产品需要发布AppStore的情况下。

2.依赖库编译安装

这里其实也可以直接使用brew安装依赖库:

brew install opencore-amr
brew install lame
brew install speex
brew install theora

就像前面所说需要指定最低兼容版本号,所以所有依赖库都需要下载源码一个一个编译:

yasm

libsnappy

libogg

libtheora

libvorbis

opencore-amr

speex

x264

fdk-aac

fontconfig

freetype

fribidi

gsm

gsm源码编译不需要configure,项目下自带 Makefile 文件,直接执行 make 就行,但是如果想要编译出动态库.dylib文件,需要手动修改 Makefile 文件:

line 143 add :

LIBGSMSO= $(LIB)/libgsm.1.0.13.dylib

line 302 add :

$(LIBGSMSO):    $(LIB) $(GSM_OBJECTS)
        $(LD) "-mmacosx-version-min=10.9" -o $(LIBGSMSO) -dynamiclib -Wl,-compatibility_version,1,-current_version,1.0.13,-install_name,$(LIBGSMSO) $(GSM_OBJECTS) -lc
        ln -fs libgsm.1.0.13.dylib lib/libgsm.1.dylib
        ln -fs libgsm.1.0.13.dylib lib/libgsm.dylib

lame

./configure CFLAGS="-mmacosx-version-min=10.9"
3.100版本源码下载下来有个编译问题,用如下方式解决:
Remove the line containing 'lame_init_old' from the file 'include/libmp3lame.sym'

libass

libbluray

SDL2

opus

xvidcore

关于依赖库编译

代码下载下来后开始逐个编译安装,基本都遵从 ./configure / make / make install 这个过程:

还是需要注意之前说到过的制定最低兼容系统版本号问题:

by configuring the autotools utility with
     ./configure CFLAGS="-mmacosx-version-min=10.9" LDFLAGS="-mmacosx-version-min=10.9"
 
and by configuring the other cmake utility with
     -D CMAKE_OSX_DEPLOYMENT_TARGET=10.9

3. 关于动态库打包和安装

编译出来的动态库默认加载路径是 /usr/local/lib, 如果希望把库打包到app里并发布到appstore给其他人使用,这个加载路径就必须改,使用 install_name_tool 工具可以达到目的:

#!/bin/sh

# change libavdevide.dylib
install_name_tool -change /usr/local/lib/libavfilter.7.dylib @loader_path/libavfilter.7.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libavformat.58.dylib @loader_path/libavformat.58.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libavcodec.58.dylib @loader_path/libavcodec.58.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libavutil.56.dylib @loader_path/libavutil.56.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libpostproc.55.dylib @loader_path/libpostproc.55.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libswresample.3.dylib @loader_path/libswresample.3.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libswscale.5.dylib @loader_path/libswscale.5.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libfreetype.6.dylib @loader_path/libfreetype.6.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libfontconfig.1.dylib @loader_path/libfontconfig.1.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/opt/sdl2/lib/libSDL2-2.0.0.dylib @loader_path/libSDL2.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libvorbisenc.2.dylib @loader_path/libvorbisenc.2.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libvorbis.0.dylib @loader_path/libvorbis.0.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libx264.157.dylib @loader_path/libx264.157.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libmp3lame.0.dylib @loader_path/libmp3lame.0.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libfdk-aac.2.dylib @loader_path/libfdk-aac.2.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libspeex.1.dylib @loader_path/libspeex.1.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libopus.0.dylib @loader_path/libopus.0.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/opt/libgsm/lib/libgsm.1.0.13.dylib @loader_path/libgsm.1.0.13.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libbluray.2.dylib @loader_path/libbluray.2.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libass.9.dylib @loader_path/libass.9.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libogg.0.dylib @loader_path/libogg.0.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libtheoraenc.1.dylib @loader_path/libtheoraenc.1.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libtheoradec.1.dylib @loader_path/libtheoradec.1.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libopencore-amrwb.0.dylib @loader_path/libopencore-amrwb.0.dylib libavdevice.58.dylib
install_name_tool -change /usr/local/lib/libopencore-amrnb.0.dylib @loader_path/libopencore-amrnb.0.dylib libavdevice.58.dylib
install_name_tool -change @rpath/libsnappy.1.dylib @loader_path/libsnappy.1.dylib libavdevice.58.dylib

# change libavfilter.dylib
install_name_tool -change /usr/local/lib/libavformat.58.dylib @loader_path/libavformat.58.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libavcodec.58.dylib @loader_path/libavcodec.58.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libavutil.56.dylib @loader_path/libavutil.56.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libpostproc.55.dylib @loader_path/libpostproc.55.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libswresample.3.dylib @loader_path/libswresample.3.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libswscale.5.dylib @loader_path/libswscale.5.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libfreetype.6.dylib @loader_path/libfreetype.6.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libfontconfig.1.dylib @loader_path/libfontconfig.1.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/opt/sdl2/lib/libSDL2-2.0.0.dylib @loader_path/libSDL2.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libvorbisenc.2.dylib @loader_path/libvorbisenc.2.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libvorbis.0.dylib @loader_path/libvorbis.0.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libx264.157.dylib @loader_path/libx264.157.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libmp3lame.0.dylib @loader_path/libmp3lame.0.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libfdk-aac.2.dylib @loader_path/libfdk-aac.2.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libspeex.1.dylib @loader_path/libspeex.1.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libopus.0.dylib @loader_path/libopus.0.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/opt/libgsm/lib/libgsm.1.0.13.dylib @loader_path/libgsm.1.0.13.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libbluray.2.dylib @loader_path/libbluray.2.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libass.9.dylib @loader_path/libass.9.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libogg.0.dylib @loader_path/libogg.0.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libtheoraenc.1.dylib @loader_path/libtheoraenc.1.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libtheoradec.1.dylib @loader_path/libtheoradec.1.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libopencore-amrwb.0.dylib @loader_path/libopencore-amrwb.0.dylib libavfilter.7.dylib
install_name_tool -change /usr/local/lib/libopencore-amrnb.0.dylib @loader_path/libopencore-amrnb.0.dylib libavfilter.7.dylib
install_name_tool -change @rpath/libsnappy.1.dylib @loader_path/libsnappy.1.dylib libavfilter.7.dylib

# change libavcodec.dylib
install_name_tool -change /usr/local/lib/libavfilter.7.dylib @loader_path/libavfilter.7.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libavformat.58.dylib @loader_path/libavformat.58.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libavutil.56.dylib @loader_path/libavutil.56.dylib libavcodec.58.dylib
install_name_tool -change @rpath/libsnappy.1.dylib @loader_path/libsnappy.1.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libswresample.3.dylib @loader_path/libswresample.3.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libvorbisenc.2.dylib @loader_path/libvorbisenc.2.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libvorbis.0.dylib @loader_path/libvorbis.0.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libx264.157.dylib @loader_path/libx264.157.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libmp3lame.0.dylib @loader_path/libmp3lame.0.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libfdk-aac.2.dylib @loader_path/libfdk-aac.2.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libspeex.1.dylib @loader_path/libspeex.1.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libopus.0.dylib @loader_path/libopus.0.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/opt/libgsm/lib/libgsm.1.0.13.dylib @loader_path/libgsm.1.0.13.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libbluray.2.dylib @loader_path/libbluray.2.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libass.9.dylib @loader_path/libass.9.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libogg.0.dylib @loader_path/libogg.0.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libtheoraenc.1.dylib @loader_path/libtheoraenc.1.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libtheoradec.1.dylib @loader_path/libtheoradec.1.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libopencore-amrwb.0.dylib @loader_path/libopencore-amrwb.0.dylib libavcodec.58.dylib
install_name_tool -change /usr/local/lib/libopencore-amrnb.0.dylib @loader_path/libopencore-amrnb.0.dylib libavcodec.58.dylib

# change libavformat.58.dylib
install_name_tool -change /usr/local/lib/libavformat.58.dylib @loader_path/libavformat.58.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libavcodec.58.dylib @loader_path/libavcodec.58.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libavutil.56.dylib @loader_path/libavutil.56.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libpostproc.55.dylib @loader_path/libpostproc.55.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libswresample.3.dylib @loader_path/libswresample.3.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libvorbisenc.2.dylib @loader_path/libvorbisenc.2.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libvorbis.0.dylib @loader_path/libvorbis.0.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libx264.157.dylib @loader_path/libx264.157.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libmp3lame.0.dylib @loader_path/libmp3lame.0.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libfdk-aac.2.dylib @loader_path/libfdk-aac.2.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libspeex.1.dylib @loader_path/libspeex.1.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libopus.0.dylib @loader_path/libopus.0.dylib libavformat.58.dylib
install_name_tool -change /usr/local/opt/libgsm/lib/libgsm.1.0.13.dylib @loader_path/libgsm.1.0.13.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libbluray.2.dylib @loader_path/libbluray.2.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libass.9.dylib @loader_path/libass.9.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libogg.0.dylib @loader_path/libogg.0.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libtheoraenc.1.dylib @loader_path/libtheoraenc.1.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libtheoradec.1.dylib @loader_path/libtheoradec.1.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libopencore-amrwb.0.dylib @loader_path/libopencore-amrwb.0.dylib libavformat.58.dylib
install_name_tool -change /usr/local/lib/libopencore-amrnb.0.dylib @loader_path/libopencore-amrnb.0.dylib libavformat.58.dylib
install_name_tool -change @rpath/libsnappy.1.dylib @loader_path/libsnappy.1.dylib libavformat.58.dylib

# change libswscale.dylib
install_name_tool -change /usr/local/lib/libavutil.56.dylib @loader_path/libavutil.56.dylib libswscale.5.dylib

# change libpostproc.dylib
install_name_tool -change /usr/local/lib/libavutil.56.dylib @loader_path/libavutil.56.dylib libpostproc.55.dylib

# change libswresample.dylib
install_name_tool -change /usr/local/lib/libavutil.56.dylib @loader_path/libavutil.56.dylib libswresample.3.dylib

# libfontconfig
install_name_tool -change /usr/local/lib/libfreetype.6.dylib @loader_path/libfreetype.6.dylib libfontconfig.1.dylib

# bluray
install_name_tool -change /usr/local/lib/libfreetype.6.dylib @loader_path/libfreetype.6.dylib libbluray.2.dylib
install_name_tool -change /usr/local/lib/libfontconfig.1.dylib @loader_path/libfontconfig.1.dylib libbluray.2.dylib

# ass
install_name_tool -change /usr/local/lib/libfreetype.6.dylib @loader_path/libfreetype.6.dylib libass.9.dylib
install_name_tool -change /usr/local/lib/libfontconfig.1.dylib @loader_path/libfontconfig.1.dylib libass.9.dylib
install_name_tool -change /usr/local/lib/libfribidi.0.dylib @loader_path/libfribidi.0.dylib libass.9.dylib

# change libvorbisenc.dylib
install_name_tool -change /usr/local/lib/libvorbis.0.dylib @loader_path/libvorbis.0.dylib libvorbisenc.2.dylib
install_name_tool -change /usr/local/lib/libogg.0.dylib @loader_path/libogg.0.dylib libvorbisenc.2.dylib

# change libvorbis.dylib
install_name_tool -change /usr/local/lib/libogg.0.dylib @loader_path/libogg.0.dylib libvorbis.0.dylib

# change libtheoraenc.dylib
install_name_tool -change /usr/local/lib/libogg.0.dylib @loader_path/libogg.0.dylib libtheoraenc.1.dylib

# change id of some dylibs
install_name_tool -id @executable_path/libavdevice.58.dylib libavdevice.58.dylib
install_name_tool -id @executable_path/libavfilter.7.dylib libavfilter.7.dylib
install_name_tool -id @executable_path/libavcodec.58.dylib libavcodec.58.dylib
install_name_tool -id @executable_path/libavutil.56.dylib libavutil.56.dylib
install_name_tool -id @executable_path/libavformat.58.dylib libavformat.58.dylib
install_name_tool -id @executable_path/libswscale.5.dylib libswscale.5.dylib
install_name_tool -id @executable_path/libpostproc.55.dylib libpostproc.55.dylib
install_name_tool -id @executable_path/libswresample.3.dylib libswresample.3.dylib
install_name_tool -id @executable_path/libfdk-aac.2.dylib libfdk-aac.2.dylib
install_name_tool -id @executable_path/libmp3lame.0.dylib libmp3lame.0.dylib
install_name_tool -id @executable_path/libx264.157.dylib libx264.157.dylib
install_name_tool -id @executable_path/libxvidcore.4.dylib libxvidcore.4.dylib

install_name_tool -id @executable_path/libtheoradec.1.dylib libtheoradec.1.dylib
install_name_tool -id @executable_path/libtheoraenc.1.dylib libtheoraenc.1.dylib
install_name_tool -id @executable_path/libopus.0.dylib libopus.0.dylib
install_name_tool -id @executable_path/libspeex.1.dylib libspeex.1.dylib
install_name_tool -id @executable_path/libvorbis.0.dylib libvorbis.0.dylib
install_name_tool -id @executable_path/libvorbisenc.2.dylib libvorbisenc.2.dylib
install_name_tool -id @executable_path/libass.9.dylib libass.9.dylib

install_name_tool -id @executable_path/libsnappy.1.dylib libsnappy.1.dylib
install_name_tool -id @executable_path/libbluray.2.dylib libbluray.2.dylib
install_name_tool -id @executable_path/libfribidi.0.dylib libfribidi.0.dylib
install_name_tool -id @executable_path/libSDL2-2.0.0.dylib libSDL2.dylib

# freetype ogg amr
install_name_tool -id @executable_path/libfreetype.6.dylib libfreetype.6.dylib
install_name_tool -id @executable_path/libfontconfig.1.dylib libfontconfig.1.dylib
install_name_tool -id @executable_path/libgsm.1.0.13.dylib libgsm.1.0.13.dylib
install_name_tool -id @executable_path/libogg.0.dylib libogg.0.dylib
install_name_tool -id @executable_path/libopencore-amrnb.0.dylib libopencore-amrnb.0.dylib
install_name_tool -id @executable_path/libopencore-amrwb.0.dylib libopencore-amrwb.0.dylib

以上是针对所有动态库的修改,可以保存到shell文件,一键执行完成。

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

推荐阅读更多精彩内容

  • 如果你拥有最高权限,如果你只管理一台服务器,那么系统自带的包管理工具就帮你解决了所有问题。但是真实世界没有那么美好...
    xuzhougeng阅读 9,928评论 4 30
  • 今天下午,当我展示我写的瘦金体的时候,被人说成这个捺好丑,被人吐槽,学会控笔有什么用,还不是写的怎么丑。 当时我快...
    鷇音bird阅读 225评论 0 0
  • 回顾: 个人成长: -给自己的资源做了个汇总。设定了理财学习计划。 -理财 1.学习了财富自由之路的六个概念: ①...
    Rosy彩霞阅读 417评论 0 0
  • 今天我在上班的时候接到石燕打来的电话,问我后天愿不愿意为妇联的三八活动做志愿者,我想都没想就答应了,感谢石燕提供的...
    张万奎阅读 104评论 0 0