Linux實用工具-GNU Auto Tools基本使用

Auto Tools是基于GNU的自動為你的軟件源代碼生成Makefile以及編譯并發(fā)布軟件軟件包等的一套軟件包管理工具集合。

這里沥曹,用一個具體的例子,來演示一下Autotools工具相對之前的"Auto Tools使用流程"例子(hello-1.0)比較"傳統(tǒng)"的基本使用方法。假設(shè)程序名字為hello-2.0福压,通過這個例子仿村,我們可以知道使用GNU Autotools 需要自己寫哪些文件锐朴,如何編寫這些文件,以及如何設(shè)置程序鏈接的靜態(tài)庫奠宜,如何指定庫的安裝與不安裝包颁,如何設(shè)置編譯選項等等瞻想。

內(nèi)容比較多,所以首先給出一個總體的使用方法娩嚼,之后對每一個步驟進行詳細(xì)的講解蘑险。

主要內(nèi)容:

一、總體步驟
二岳悟、詳細(xì)解釋
三佃迄、關(guān)于configure配置
四、文件詳細(xì)信息
五贵少、其它

一呵俏、總體步驟

1,編寫hello-2.0程序

查看最初代碼目錄結(jié)構(gòu)如下:

#pwd
/root/test/hello-2.0
#ls
lib src my_doc

這里大致內(nèi)容如下:

  • src/中的文件是程序的主文件。
  • lib/中的文件是程序需要鏈接的庫滔灶。
  • lib/iface1中的庫只是作為鏈接使用普碎,并不安裝在系統(tǒng)中。
  • lib/ifacex中的庫不僅要鏈接录平,而且安裝的時候要安裝到系統(tǒng)中麻车。

2,為程序hello-2.0添加Autotools模板文件

為了讓Autotools可以自動生成符合標(biāo)準(zhǔn)GNU風(fēng)格的Makefile,需要添加一些文件斗这。實際上动猬,我們必須寫并且要向源代碼中添加的文件就兩種:

  • configure.ac,
  • Makefile.am表箭。

3,生成配置文件

# autoreconf --install

運行這個命令之后會生成了許多其他的文件赁咙,其中核心的程序是configure腳本,通過它以及生成的 Makefile.in 文件免钻,最終會生成需要的Makefile.

4,配置并生成Makefile

#mkdir hello_build
#cd hello_build
#../configure CONFIG_SITE=$(pwd)/../config.site --prefix=$(pwd)/target

這里彼水,會生成Makefile,生成Makefile之后伯襟,才能構(gòu)進行后面的編譯工作猿涨。

5,編譯并安裝軟件

#make
#make install

運行 make 就是編譯,運行 make install 會將生成的將要安裝的文件復(fù)制到之前指定的prefix目錄(這里就是target)中姆怪。

6,發(fā)布軟件包

#make dist

這樣就會對軟件包進行發(fā)布叛赚。發(fā)布的內(nèi)容被打包到一個tar包中,其中包含的內(nèi)容沒有編譯中間文件稽揭,而是運行 autoreconf --install 命令之后的一些文件俺附。

二、詳細(xì)解釋

這里溪掀,對以上的步驟進一步解釋事镣,想要知道其中涉及到的文件的具體內(nèi)容,可以參考后面的"文件詳細(xì)信息"

1揪胃、編寫hello-2.0程序

編寫之后璃哟,使用find命令查看程序的源代碼目錄結(jié)構(gòu)如下:

#cd hello-2.0
#find .
.
./my_doc
./src
./src/main.c
./src/myprint.c
./src/myprint.h
./lib
./lib/iface1
./lib/iface1/print1.c
./lib/iface1/print1.h
./lib/ifacex
./lib/ifacex/print2.c
./lib/ifacex/print3.c
./lib/ifacex/printx.h

這里氛琢,為了方便閱讀,我調(diào)整了輸出的順序随闪。其中my_doc文件是一個自己隨便寫的說明文件阳似,記錄本程序使用的方法供學(xué)習(xí)使用。根據(jù)輸出铐伴,我們可以了解到撮奏,

  • src/中的文件是程序的主文件。
  • lib/中的文件是程序需要鏈接的庫当宴。
  • lib/iface1中的庫只是作為鏈接使用畜吊,并不安裝在系統(tǒng)中。
  • lib/ifacex中的庫不僅要鏈接户矢,而且安裝的時候要安裝到系統(tǒng)中玲献。

2、為程序hello-2.0添加Autotools模板文件

添加之后逗嫡,使用find命令查看源代碼目錄結(jié)構(gòu)如下:

#cd hello-2.0
#find .
.
./my_doc
./src
./src/main.c
./src/myprint.c
./src/myprint.h
./lib
./lib/iface1
./lib/iface1/print1.c
./lib/iface1/print1.h
./lib/ifacex
./lib/ifacex/print2.c
./lib/ifacex/print3.c
./lib/ifacex/printx.h
./configure.ac
./config.site
./Makefile.am
./src/Makefile.am
./lib/Makefile.am
./lib/iface1/Makefile.am
./lib/ifacex/Makefile.am

這里青自,為了方便閱讀株依,我調(diào)整了輸出順序驱证。根據(jù)輸出我們可以知道,為了讓Autotools可以自動生成符合標(biāo)準(zhǔn)GNU風(fēng)格的Makefile恋腕,我們添加了不少的文件抹锄。下面分別對添加的文件的功能進行介紹。

./configure.ac

這個文件是Autoconf工具需要讀取的模板文件荠藤,通過這個文件指定軟件包一些全局的信息伙单。

./config.site

這個文件是可選的,是將要生成configure腳本的配置文件哈肖,configure可以通過這個配置文件設(shè)置一些選項吻育。

./Makefile.am, ./src/Makefile.am, ./lib/Makefile.am, ./lib/iface1/Makefile.am, ./lib/ifacex/Makefile.am

這些Makefile.am文件都是是生成Makefile文件所需的模板文件,包含源代碼文件以及一些編譯選項信息淤井。

通過一個頂層的 Makefile.am 指定各個子 Makefile.am 位置布疼,實際可以把所有文件內(nèi)容集中到一個Makefile.am中,不過現(xiàn)在這樣寫币狠,是為了了解關(guān)于Makefile.am更多的知識游两。

總結(jié)

更多這些文件具體的信息,通過后面給出的文件詳細(xì)內(nèi)容可以了解漩绵。實際上贱案,通過以上的介紹,我們可知止吐,為了讓Autotools真正開始工作宝踪,我們必須寫并且要向源代碼中添加的文件就兩種:

  • configure.ac侨糟,
  • Makefile.am。

3瘩燥、生成配置文件

# autoreconf --install
configure.ac: installing `build-aux/install-sh'
configure.ac: installing `build-aux/missing'
lib/iface1/Makefile.am: installing `build-aux/depcomp'

運行之后粟害,查看代碼目錄如下:

#find .
.
./my_doc
./src
./src/main.c
./src/myprint.c
./src/myprint.h
./lib
./lib/iface1
./lib/iface1/print1.c
./lib/iface1/print1.h
./lib/ifacex
./lib/ifacex/print2.c
./lib/ifacex/print3.c
./lib/ifacex/printx.h

./configure.ac
./config.site
./Makefile.am
./src/Makefile.am
./lib/Makefile.am
./lib/iface1/Makefile.am
./lib/ifacex/Makefile.am

./configure
./Makefile.in
./aclocal.m4
./config.h.in
./lib/Makefile.in
./lib/iface1/Makefile.in
./lib/ifacex/Makefile.in
./src/Makefile.in
./build-aux
./build-aux/missing
./build-aux/install-sh
./build-aux/depcomp
./autom4te.cache
./autom4te.cache/output.0
./autom4te.cache/requests
./autom4te.cache/traces.1
./autom4te.cache/output.1
./autom4te.cache/traces.0

這里,為了便于閱讀颤芬,我調(diào)整了輸出的順序悲幅。

可見,除了之前我們添加的文件之外站蝠,還生成了許多其他的文件汰具,其中核心的程序是configure腳本,通過它以及生成的Makefile.in文件菱魔,最終會生成需要的Makefile.

至此留荔,這些文件也就是我們發(fā)布軟件時候的文件了。下面我們看看編譯的過程澜倦。

4聚蝶、配置并生成Makefile

#mkdir hello_build
#cd hello_build
#../configure CONFIG_SITE=$(pwd)/../config.site --prefix=$(pwd)/target

運行之后,查看代碼目錄如下:

# pwd
/root/test/hello-2.0/hello_build
# find
.
./src
./src/.deps
./src/.deps/myprint.Po
./src/.deps/main.Po
./src/Makefile
./config.h
./lib
./lib/iface1
./lib/iface1/.deps
./lib/iface1/.deps/print1.Po
./lib/iface1/Makefile
./lib/ifacex
./lib/ifacex/.deps
./lib/ifacex/.deps/print2.Po
./lib/ifacex/.deps/print3.Po
./lib/ifacex/Makefile
./lib/Makefile
./config.log
./stamp-h1
./config.status
./Makefile

這里藻治,生成Makefile之后碘勉,才能構(gòu)進行后面的編譯工作。

  1. 我們創(chuàng)建hello_build目錄的目的是想要將編譯的中間文件集中到一個目錄中而不會影響到原來的源代碼的目錄結(jié)構(gòu)桩卵,因為configure程序的特點就是验靡,在那里運行它,那么就會將哪里做為編譯的初始目錄;
  2. 我們使用CONFIG_SITE環(huán)境變量設(shè)置configure讀取的配置文件(config.site)的位置雏节,這里要使用絕對路徑胜嗓,如果沒有設(shè)置這個環(huán)境變量,那么就會尋找prefix/share/config.site文件钩乍,如果還沒有就使用prefix/etc/config.site文件辞州;
  3. prefix就是使用–prefix指定的軟件安裝目錄,后面做"make install"安裝軟件的時候寥粹,會將軟件安裝到這個目錄下变过。

另外,如果我們在config.site指定用交叉編譯(比如arm)排作,那么運行的命令類似如下

#../configure CONFIG_SITE=$(pwd)/../config.site --host=i686 --prefix=$(pwd)/target

這里使用–host指定編譯主機牵啦。

5、編譯并安裝軟件

#make
#make install

運行make就是為了編譯軟件妄痪,運行make install會將生成的將要安裝的文件復(fù)制到之前指定的prefix目錄(這里就是target)中哈雏。

查看運行之后的目錄結(jié)構(gòu)如下:

# pwd
/root/test/hello-2.0/hello_build
# find .
.
./src
./src/myprint.o
./src/.deps
./src/.deps/myprint.Po
./src/.deps/main.Po
./src/main.o
./src/hello
./src/Makefile
./config.h
./target
./target/bin
./target/bin/hello
./target/lib
./target/lib/libifacex.a
./target/include
./target/include/printx.h
./target/include/myprint.h
./lib
./lib/iface1
./lib/iface1/libiface1.a
./lib/iface1/print1.o
./lib/iface1/.deps
./lib/iface1/.deps/print1.Po
./lib/iface1/Makefile
./lib/ifacex
./lib/ifacex/print3.o
./lib/ifacex/libifacex.a
./lib/ifacex/print2.o
./lib/ifacex/.deps
./lib/ifacex/.deps/print2.Po
./lib/ifacex/.deps/print3.Po
./lib/ifacex/Makefile
./lib/Makefile
./config.log
./stamp-h1
./config.status
./Makefile

這里,我們就完成了軟件的編譯和安裝。

6裳瘪、發(fā)布軟件包

#make dist

這樣就會對軟件包進行發(fā)布土浸。查看這個命令之后的目錄結(jié)構(gòu)如下:

#ls -p
config.h config.log config.status hello-2.0.tar.gz lib/ Makefile src/ stamp-h1 target/

從這里我們發(fā)現(xiàn),實際就是生成了一個hello-2.0.tar.gz彭羹,也就是軟件的發(fā)布包黄伊。查看其中的內(nèi)容如下:

#tar -tzvf hello-2.0.tar.gz
drwxr-xr-x 0/0 0 2011-06-17 14:49:23 hello-2.0/
-rwxrwxrwx 500/500 20 2011-06-17 11:19:57 hello-2.0/Makefile.am
drwxr-xr-x 0/0 0 2011-06-17 14:49:23 hello-2.0/src/
-rwxr-xr-x 0/0 228 2011-06-17 11:25:40 hello-2.0/src/Makefile.am
-rwxrwxrwx 500/500 292 2011-06-17 13:47:46 hello-2.0/src/main.c
-rwxrwxrwx 500/500 141 2011-06-16 18:15:09 hello-2.0/src/myprint.c
-rwxrwxrwx 500/500 63 2011-01-31 15:32:46 hello-2.0/src/myprint.h
-rw-r--r-- 0/0 13581 2011-06-17 14:28:58 hello-2.0/src/Makefile.in
drwxr-xr-x 0/0 0 2011-06-17 14:49:23 hello-2.0/build-aux/
-rwxr-xr-x 0/0 11014 2011-06-17 14:28:58 hello-2.0/build-aux/missing
-rwxr-xr-x 0/0 9233 2011-06-17 14:28:58 hello-2.0/build-aux/install-sh
-rwxr-xr-x 0/0 15936 2011-06-17 14:28:58 hello-2.0/build-aux/depcomp
drwxr-xr-x 0/0 0 2011-06-17 14:49:23 hello-2.0/lib/
-rwxr-xr-x 0/0 24 2011-06-16 18:09:59 hello-2.0/lib/Makefile.am
drwxr-xr-x 0/0 0 2011-06-17 14:49:23 hello-2.0/lib/iface1/
-rwxr-xr-x 0/0 119 2011-06-16 18:13:32 hello-2.0/lib/iface1/Makefile.am
-rwxrwxrwx 500/500 78 2011-02-01 14:42:55 hello-2.0/lib/iface1/print1.c
-rwxrwxrwx 500/500 60 2010-10-19 11:58:30 hello-2.0/lib/iface1/print1.h
-rw-r--r-- 0/0 11388 2011-06-17 14:28:58 hello-2.0/lib/iface1/Makefile.in
-rw-r--r-- 0/0 13019 2011-06-17 14:28:58 hello-2.0/lib/Makefile.in
drwxr-xr-x 0/0 0 2011-06-17 14:49:23 hello-2.0/lib/ifacex/
-rwxrwxrwx 500/500 82 2011-06-16 18:08:28 hello-2.0/lib/ifacex/print2.c
-rwxr-xr-x 0/0 235 2011-06-17 10:34:32 hello-2.0/lib/ifacex/Makefile.am
-rwxr-xr-x 0/0 82 2011-06-16 18:08:39 hello-2.0/lib/ifacex/print3.c
-rwxrwxrwx 500/500 75 2011-06-16 18:07:56 hello-2.0/lib/ifacex/printx.h
-rw-r--r-- 0/0 13795 2011-06-17 14:28:58 hello-2.0/lib/ifacex/Makefile.in
-rw-r--r-- 0/0 31120 2011-06-17 14:28:56 hello-2.0/aclocal.m4
-rwxrwxrwx 500/500 878 2011-06-17 11:19:04 hello-2.0/configure.ac
-rwxr-xr-x 0/0 132936 2011-06-17 14:28:57 hello-2.0/configure
-rw-r--r-- 0/0 18068 2011-06-17 14:28:58 hello-2.0/Makefile.in
-rw-r--r-- 0/0 557 2011-06-17 14:28:57 hello-2.0/config.h.in

這里,實際我們發(fā)布軟件包的時候派殷,發(fā)布的文件有一些是通過我們最初建立的那幾個Makefile.am指定的还最,我們發(fā)布的文件都是運行

$autoreconf --install

生成configure之后的、但是生成Makefile之前的那些文件毡惜。(注意拓轻,我們可以看到其中的config.site和自己建立的文檔my_doc并沒有被包含進來。)

三经伙、關(guān)于configure配置

對于configure配置扶叉,生成的Makefile,以及編譯安裝之后的程序帕膜,我們需要了解如下一些知識枣氧。

1,一些常用的make目標(biāo)

實際上,在前面我們還可以運行 make clean, make distclean 等命令垮刹,之前的講解已經(jīng)對這些做了實踐达吞,這里就不演示了。

這里對一些常見的Makefile目標(biāo)進行一點總結(jié)危纫,如下:

  • "make all" 編譯程序宗挥,庫,以及文檔等等(和"make"一樣)种蝶。
  • "make install" 安裝可執(zhí)行程序。
  • "make install-strip" 和"make install"一樣, 然后去掉調(diào)試信息瞒大。
  • "make uninstall" 和"make install"功能一樣螃征。
  • "make clean" 清除編譯的中間文件(和"make all"功能相反)
  • "make distclean" 除了前面的"make clean"之外,還清除所有"./configure"創(chuàng)建的中間文件透敌。
  • "make check" 如果有測試包的話盯滚,則運行之。
  • "make installcheck" 如果支持的化酗电,就檢查已經(jīng)安裝的程序或者庫魄藕。
  • "make dist" 創(chuàng)建PACKAGE-VERSION.tar.gz發(fā)布包。

2,configure常用路徑變量

./configure和安裝路徑相關(guān)的常用變量:

變量名稱 默認(rèn)值
prefix "/usr/local"
exec-prefix prefix
bindir exec-prefix"/bin"
libdir exec-prefix"/lib"
...
includedir prefix"/include"
datarootdir prefix"/share"
datadir datarootdir
mandir datarootdir"/man"
infodir datarootdir"/info"

這些變量可以自行指定撵术,例如指定prefix之后再進行安裝,例如:

$./configure --prefix ~/usr
$make
$make install

這里背率,–prefix后面可以有"="也可以沒有。

3,configure常用配置選項變量:

./configure和配置相關(guān)的常用變量:

CC C編譯器命令
CFLAGS C編譯選項
CXX C++編譯器命令
CXXFLAGS C++編譯選項
LDFLAGS 鏈接選項
CPPFLAGS C/C++預(yù)處理選項

更多的選項可以參見 ./configure --help

使用舉例:

$./configure --prefix ~/usr CC=gcc-3 CPPFLAGS=-I$HOME/usr/include LDFLAGS=-L$HOME/usr/lib

四、文件詳細(xì)信息

這里寝姿,列出了最初那些需要我們寫的文件的內(nèi)容,也注明了其中需要注意的內(nèi)容交排。

src/main.c文件:

#include <stdio.h>
#include "myprint.h"
int main(int argc, char *argv[])
{
#ifdef MYDEBUG1
printf("Define MYDEBUG1\n");
#else
printf("Havn't define MYDEBUG1\n");
#endif
#ifdef MYDEBUG2
printf("Define MYDEBUG2\n");
#else
printf("Havn't define MYDEBUG2\n");
#endif
myprint();
return 0;
}

src/myprint.h文件:

#ifndef __MYPRINT_H
#define __MYPRINT_H
void myprint();
#endif

src/myprint.c文件:

#include "myprint.h"
#include "../lib/iface1/print1.h"
#include "../lib/ifacex/printx.h"
void myprint()
{
print1();
print2();
print3();
}

lib/iface1/print1.h

#ifndef __PRINT1_H
#define __PRINT1_H
void print1();
#endif

lib/iface1/print1.c

#include <stdio.h>
#include "print1.h"
void print1()
{
printf("print1\n");
}

lib/ifacex/printx.h

#ifndef __PRINTX_H
#define __PRINTX_H
void print2();
void print3();
#endif

lib/ifacex/print2.c

#include <stdio.h>
#include "printx.h"
void print2(void)
{
printf("print2\n");
}

lib/ifacex/print3.c

#include <stdio.h>
#include "printx.h"
void print3(void)
{
printf("print3\n");
}

至此,列出的都是源代碼饵筑,后面將列出Autotools需要的文件埃篓。

./configure.ac

#This file is edited by QuietHeart.

#*Package name, version, and bug report address.
AC_INIT([hello], [2.0], [quiet_heart000@126.com])

#A safe check make sure 'configure' is not run from outer space.
AC_CONFIG_SRCDIR([src/main.c])

#Auxiliary scripts such as install-sh and depcomp should be in this directory.
AC_CONFIG_AUX_DIR([build-aux])

#Turn automake warnings and report them as errors. This is a foreign package.
AM_INIT_AUTOMAKE([-Wall -Werror foreign])

#Check for C compile.
AC_PROG_CC

#For libuse in Makefile.am
AC_PROG_RANLIB
#AC_PROG_LIBTOOL

#Declare config.h as output header.
AC_CONFIG_HEADERS([config.h])

#XXX Declare Makefile as output file
#!!!Note:The order should be the same as Makefile.am, indicate the build order.
AC_CONFIG_FILES([Makefile
lib/Makefile
lib/iface1/Makefile
lib/ifacex/Makefile
src/Makefile
])

#Output all declared files.
AC_OUTPUT

這個文件,需要注意的一個地方就是使用AC_CONFIG_FILES指定的Makefile次序要和Makefile.am中指定的目錄遞歸次序一致根资,并且這個次序也表明了編譯的次序架专。

./config.site

###### Compile tools.
#CC=arm-sony-linux-gnueabi-gcc
CC=gcc
#LD=arm-sony-linux-gnueabi-ld
#AR=arm-sony-linux-gnueabi-ar
#LDFLAGS+="-lsonypthread -lsonydl -lsonyrt -lsonyc -lsonygcc_s "

###### Global options.
#!!!Note: You'd better put the variables value in quote,and add ' ' after param value.
CFLAGS+="-g "
CFLAGS+="-D MYDEBUG1 "
CFLAGS+="-D MYDEBUG2 "

###### Miscellaneous
#prefix=
#test -z "$CC" && CC=gcc-3
#test -z "$CPPFLAGS" && CPPFLAGS=-I$HOME/usr/include
#test -z "$LDFLAGS" && LDFLAGS=-L$HOME/usr/lib

這個文件需要注意的就是,編譯選項的值要用""括起來玄帕,并且最后要有一個空格胶征。

./Makefile.am

SUBDIRS = . lib src

src/Makefile.am

#AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=
include_HEADERS=

hello_SOURCES+=main.c \
myprint.c

include_HEADERS+=myprint.h

#!!!Note the path.
hello_LDADD=../lib/iface1/libiface1.a ../lib/ifacex/libifacex.a

這里需要注意的是,使用hello_LDADD可以指定hello需要鏈接的庫桨仿,路徑要使用相對當(dāng)前Makefile.am的路徑睛低。如果需要專門指定hello這個程序的編譯選項可以設(shè)置hello_CFLAGS等,具體參見手冊服傍。

lib/Makefile.am

SUBDIRS = iface1 ifacex

lib/iface1/Makefile.am

#lib not installed only used for building.
noinst_LIBRARIES=libiface1.a

libiface1_a_SOURCES= print1.c \
print1.h

lib/ifacex/Makefile.am

#lib tobe installed
lib_LIBRARIES=libifacex.a

#source code files.
#note: you can use 'find -name *.c' if has too much source code.
libifacex_a_SOURCES= print2.c \
print3.c

#header files to be installed.
include_HEADERS=printx.h

這里有個技巧钱雷,就是如果代碼文件太多了的話Makefile.am也會很多,我們可以用類似"find -name *.c"的命令來輸出相應(yīng)的文件吹零,用"+="的賦值的方式統(tǒng)一處理添加罩抗。

五、其它

參考資料:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灿椅,一起剝皮案震驚了整個濱河市套蒂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茫蛹,老刑警劉巖操刀,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異婴洼,居然都是意外死亡骨坑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進店門柬采,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欢唾,“玉大人,你說我怎么就攤上這事粉捻〗盖玻” “怎么了?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵肩刃,是天一觀的道長祟霍。 經(jīng)常有香客問我杏头,道長,這世上最難降的妖魔是什么浅碾? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任大州,我火速辦了婚禮,結(jié)果婚禮上垂谢,老公的妹妹穿的比我還像新娘厦画。我一直安慰自己,他們只是感情好滥朱,可當(dāng)我...
    茶點故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布根暑。 她就那樣靜靜地躺著,像睡著了一般徙邻。 火紅的嫁衣襯著肌膚如雪排嫌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天缰犁,我揣著相機與錄音淳地,去河邊找鬼。 笑死帅容,一個胖子當(dāng)著我的面吹牛颇象,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播并徘,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼遣钳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了麦乞?” 一聲冷哼從身側(cè)響起蕴茴,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姐直,沒想到半個月后倦淀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡简肴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年晃听,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砰识。...
    茶點故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖佣渴,靈堂內(nèi)的尸體忽然破棺而出辫狼,到底是詐尸還是另有隱情,我是刑警寧澤辛润,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布膨处,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏真椿。R本人自食惡果不足惜鹃答,卻給世界環(huán)境...
    茶點故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望突硝。 院中可真熱鬧测摔,春花似錦、人聲如沸解恰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽护盈。三九已至挟纱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腐宋,已是汗流浹背紊服。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胸竞,地道東北人欺嗤。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像撤师,于是被迫代替她去往敵國和親剂府。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,587評論 2 350