xmake入門,構(gòu)建項(xiàng)目原來可以如此簡(jiǎn)單

前言

在開發(fā)xmake之前急波,我一直在使用gnumake/makefile來維護(hù)個(gè)人C/C++項(xiàng)目从铲,一開始還好,然而等項(xiàng)目越來越龐大后澄暮,維護(hù)起來就非常吃力了名段,后續(xù)也用過一陣子automake系列工具阱扬,并不是很好用。

由于C/C++程序的構(gòu)建過程比較繁瑣伸辟,如果不借助IDE工具麻惶,很難快速構(gòu)建一個(gè)新的C/C++程序,想要跨平臺(tái)構(gòu)建就更加麻煩了信夫。

雖然IDE很好用窃蹋,也很強(qiáng)大,但是還是有很多不足的地方静稻,例如:

  • 跨平臺(tái)開發(fā)支持不完善
  • 自身環(huán)境不一定跨平臺(tái)
  • 過于臃腫
  • 不利于服務(wù)端自動(dòng)化部署構(gòu)建
  • 不夠靈活警没,定制化配置構(gòu)建過程有局限性

當(dāng)然如果你熟悉makefile的話,也可以手敲makefile振湾,不過不同平臺(tái)用的make也不相同杀迹,比如: gnumake, nmake等,導(dǎo)致makefile語法存在差異性押搪,無法做到一致性編譯树酪,而且對(duì)開發(fā)者有一定的使用門檻。

在win上使用gnumake還得裝cygwin大州,mingw-msys等環(huán)境续语,也非常麻煩,折騰完環(huán)境就得半天時(shí)間厦画。

目前已經(jīng)有了很多現(xiàn)代化的構(gòu)建工具疮茄,方便開發(fā)者構(gòu)建和維護(hù)C/C++項(xiàng)目,例如:cmake, scons, premake, bazel, gn, gyp等等苛白。

其中很多只能生成對(duì)應(yīng)的IDE工程娃豹,然后再通過對(duì)應(yīng)IDE來維護(hù)和構(gòu)建,這種只是解決了C/C++項(xiàng)目的一致性維護(hù)問題购裙,但是構(gòu)建方式不一致懂版,因此還是沒解決之前列舉的大部分不足點(diǎn),也無法直接快速構(gòu)建躏率。

而cmake, scons雖然很強(qiáng)大躯畴,但是cmake語法怪異不直觀,本人實(shí)在是不習(xí)慣薇芝,scons使用還需要依賴python蓬抄,py2/py3的問題折騰起來也比較蛋疼。

鑒于此夯到,我采用了lua來描述工程嚷缭,利用lua的輕量,簡(jiǎn)潔,靈活阅爽,跨平臺(tái)等特性路幸,來解決上述遇到的各種問題,使用xmake將會(huì)帶來不一樣的構(gòu)建體驗(yàn):

  • 輕量付翁,跨平臺(tái)简肴,無依賴,無需額外安裝python等第三方環(huán)境百侧,直接內(nèi)置lua運(yùn)行時(shí)砰识,一個(gè)安裝包(或者命令)直接搞定
  • 工程描述直觀簡(jiǎn)潔,更符合用戶正常的思維習(xí)慣
  • 支持直接構(gòu)建佣渴,強(qiáng)大的命令行工具辫狼,終端用戶的福音,裝逼用戶必備
  • vscode, idea, clion, sublime, vim等編輯器插件支持
  • 智能檢測(cè)支持辛润,簡(jiǎn)化用戶編譯配置過程
  • 插件支持予借,靈活的用戶可擴(kuò)展性
  • vcproj等IDE項(xiàng)目文件生成也支持的哦
  • 更多隱藏特性等你來體驗(yàn)
xmake-compilation

快速上手

不會(huì)寫makefile?沒關(guān)系频蛔,直接在源碼目錄運(yùn)行以下命令即可直接編譯:

xmake

xmake會(huì)自動(dòng)掃描在當(dāng)前目錄下的源碼結(jié)構(gòu),生成一個(gè)xmake.lua工程描述文件秦叛,然后嘗試直接編譯晦溪。

想要直接運(yùn)行編譯后的可執(zhí)行程序,簡(jiǎn)單挣跋,直接敲:

$ xmake run

更多相關(guān)信息三圆,請(qǐng)參考文章: xmake新增智能代碼掃描編譯模式,無需手寫任何make文件

快速入門

如果想要更進(jìn)一步描述工程避咆,調(diào)整源碼結(jié)構(gòu)舟肉,添加一些編譯選項(xiàng)什么的,還是需要維護(hù)一個(gè)名叫xmake.lua的工程描述文件查库,類似makefile, cmakelist.txt路媚,但是其語法和api經(jīng)過不斷地改進(jìn)簡(jiǎn)化,已經(jīng)相當(dāng)易用樊销。

最簡(jiǎn)單的描述例子只需要三行:

target("test")
    set_kind("binary")
    add_files("src/*.c")

就可以構(gòu)建一個(gè)可執(zhí)行程序整慎,編譯所有在src目錄下的c源文件。

然后直接執(zhí)行xmake即可編譯围苫。

add_files()支持通配符文件模式匹配裤园,并且支持.c, .cpp, .go, .d, .m, .mm, .S, .swift, .rc, .rs等各種native語言的代碼文件,大部分都能支持混編剂府。

我們甚至可以添加.a和.o, .obj文件到add_files()拧揽,例如:

target("test")
    set_kind("static")
    add_files("src/*.c")
    add_files("lib/libxxx.a", "obj/bbb.o")

上述描述會(huì)編譯生成一個(gè)libtest.a庫(kù),在編譯歸檔的時(shí)候,會(huì)自動(dòng)將libxxx.a庫(kù)反解出來淤袜,合并到libtest.a中去痒谴,并且同時(shí)將bbb.o也加進(jìn)去。

xmake提供的add_files是非常強(qiáng)大的饮怯,我們還可以再添加一批文件的同時(shí)闰歪,指定排除某些文件,例如:

add_files("src/**.cpp|test.cpp|arm/*.cpp")

上述描述蓖墅,在遞歸添加源文件的同時(shí)库倘,排除掉了test.cpp以及arm目錄下的源文件。

更多add_files用法论矾,請(qǐng)參考文檔:add_files接口使用文檔

使用演示

命令行下的使用過程教翩,大家可以通過一個(gè)視頻直觀的體驗(yàn)下:

創(chuàng)建工程

更加省事的方式就是通過上節(jié)所說傻瓜式操作方式,自動(dòng)生成一個(gè)xmake.lua贪壳,然后在這基礎(chǔ)下修修改改就行了饱亿。

當(dāng)然如果沒有現(xiàn)成源碼,想從新工程創(chuàng)建開始編譯闰靴,那么可以使用xmake提供的工程模板進(jìn)行創(chuàng)建:

$ xmake create test

默認(rèn)創(chuàng)建一個(gè)名為test的c可執(zhí)行項(xiàng)目彪笼,源碼結(jié)構(gòu)如下:

.
├── src
│   └── main.c
└── xmake.lua

當(dāng)然你也可以選擇語言和模板類型:

$ xmake create -l c++ -t shared test

上述命令創(chuàng)建了一個(gè)c++動(dòng)態(tài)庫(kù)項(xiàng)目,就這么簡(jiǎn)單蚂且。

運(yùn)行和調(diào)試

編譯完的可執(zhí)行程序配猫,直接敲xmake run就能運(yùn)行,xmake會(huì)自動(dòng)找到對(duì)應(yīng)的target目標(biāo)文件杏死,你也可以傳遞參數(shù)給程序泵肄。

如果有多個(gè)target目標(biāo),你可以指定需要運(yùn)行的target名淑翼,例如:

$ xmake run test

想要快速調(diào)試程序腐巢?加上-d參數(shù)即可

$ xmake run -d test

xmake默認(rèn)會(huì)去找系統(tǒng)自帶的調(diào)試器,然后加載運(yùn)行玄括,windows上使用vsjitdebugger冯丙,linux上gdb,macos上lldb惠豺,當(dāng)然你也可以隨意切換到其他調(diào)試器银还。

配合debug模式編譯,就能做到使用xmake進(jìn)行源碼調(diào)試洁墙。

可視化配置和構(gòu)建

xmake提倡使用命令行的方式來操作蛹疯,用習(xí)慣后效率非常高,而且在windows上热监,即使沒有cygwin捺弦,也可以直接在cmd下正常運(yùn)行。

當(dāng)然,并不是所有用戶習(xí)慣命令行列吼,因此xmake也提供了編輯器插件幽崩,與各大編輯器進(jìn)行集成,例如:

xmake-vscode插件

image

xmake-idea插件

[站外圖片上傳中...(image-8fbf21-1522240153002)]

xmake-sublime插件

image

xmake-tui界面

除了編輯器插件寞钥,xmake甚至自己封裝實(shí)現(xiàn)了一整套跨平臺(tái)tui字符界面庫(kù)慌申,然后仿kconfig/menuconf的界面風(fēng)格,實(shí)現(xiàn)了一個(gè)類似的可視化字符界面菜單配置理郑。

這個(gè)不需要額外的插件蹄溉,只需要在終端下執(zhí)行:

$ xmake f --menu

就可以顯示菜單配置界面進(jìn)行編譯配置,配置完即可根據(jù)當(dāng)前配置進(jìn)行編譯您炉,效果如下:

[站外圖片上傳中...(image-2b6975-1522240153002)]

定制化編譯

想要更加靈活的編譯配置柒爵?那就得要修改xmake.lua啦,不過還是很簡(jiǎn)單的赚爵。

添加編譯選項(xiàng)

target("test")
    set_kind("binary")
    add_files("src/*.c")
    if is_mode("debug") then
       add_cxflags("-DDEBUG")
    end

上面代碼中棉胀,add_cxflags接口就是同時(shí)配置C/C++代碼的編譯選項(xiàng),并且只在debug模式下生效冀膝,也就是執(zhí)行下面命令的時(shí)候:

$ xmake f -m debug
$ xmake

使用內(nèi)置選項(xiàng)

像添加宏定義唁奢,設(shè)置警告級(jí)別,優(yōu)化級(jí)別窝剖,頭文件搜索目錄什么的驮瞧,完全沒必要使用原始的add_cxflags接口,xmake有提供更加方便的接口枯芬,更加智能化的處理來簡(jiǎn)化配置,也更加通用跨平臺(tái)采郎,例如:

add_defines("DEBUG")
set_optimize("fast")
set_warnings("all", "error")

target("test")
    set_kind("binary")
    add_files("src/*.c")

target("test2")
    set_kind("binary")
    add_files("src2/*.c")

跟剛才的配置不同的是千所,此處設(shè)置放在了target的上面,此處不屬于target域蒜埋,是root全局設(shè)置淫痰,會(huì)影響下面的所有target目標(biāo)程序的編譯設(shè)置,這樣可以簡(jiǎn)化配置整份,避免冗余待错。

靈活的腳本控制

對(duì)于高端用戶,構(gòu)建需求復(fù)雜多變烈评,xmake也提供了對(duì)應(yīng)解決方案火俄,各個(gè)構(gòu)建階段都可以靈活定制:

target("test")
    set_kind("binary")
    add_files("src/*.c")

    after_build(function (target)
        os.exec("file %s", target:targetfile())
    end)

上述代碼在編譯程序結(jié)束后,執(zhí)行file命令查看目標(biāo)程序相關(guān)信息讲冠,目前xmake可以在build, clean, run, install, uninstall等各個(gè)階段的前后插入自定義的腳本瓜客,也可以直接內(nèi)置action,例如: on_install會(huì)覆蓋內(nèi)置的安裝邏輯,提供給用戶足夠的靈活性谱仪。

方便的多目標(biāo)依賴

很多時(shí)候玻熙,一個(gè)項(xiàng)目會(huì)有多個(gè)target目標(biāo)程序,之間存在依賴關(guān)系疯攒,例如: 一個(gè)可執(zhí)行程序hello嗦随,依賴一個(gè)靜態(tài)庫(kù)libtest.a,我們只需要通過add_deps將兩個(gè)target做個(gè)關(guān)聯(lián)就行了敬尺,libtest.a的搜索目錄枚尼,頭文件目錄設(shè)置什么的都不需要關(guān)心,xmake會(huì)自動(dòng)處理:

target("test")
    set_kind("static")
    add_files("src/test/*.c")

target("hello")
    add_deps("test")  --添加依賴
    set_kind("binary")
    add_files("src/hello/*.c")

預(yù)編譯頭文件支持

xmake支持通過預(yù)編譯頭文件去加速c/c++程序編譯筷转,目前支持的編譯器有:gcc, clang和msvc姑原。

target("test")
    -- ...
    set_pcxxheader("header.h")

各大編譯器對(duì)預(yù)編譯頭的處理方式存在很大差異,而xmake將其差異性隱藏了起來呜舒,提供一致性的描述設(shè)置锭汛,簡(jiǎn)化用戶在跨平臺(tái)編譯時(shí)候的處理,
具體關(guān)于編譯器對(duì)預(yù)編譯頭文件的處理袭蝗,可參考相關(guān)文章:不同編譯器對(duì)預(yù)編譯頭文件的處理

自定義編譯規(guī)則

xmake不僅原生內(nèi)置支持多種語言文件的構(gòu)建唤殴,而且還可以通過自定義構(gòu)建規(guī)則,讓用戶自己來實(shí)現(xiàn)復(fù)雜的未知文件構(gòu)建到腥。

我們可以通過預(yù)先設(shè)置規(guī)則支持的文件后綴朵逝,來擴(kuò)展其他文件的構(gòu)建支持:

-- 定義一個(gè)markdown文件的構(gòu)建規(guī)則
rule("markdown")
    set_extensions(".md", ".markdown")
    on_build(function (target, sourcefile)
        os.cp(sourcefile, path.join(target:targetdir(), path.basename(sourcefile) .. ".html"))
    end)

target("test")
    set_kind("binary")
    
    -- 使test目標(biāo)支持markdown文件的構(gòu)建規(guī)則
    add_rules("markdown")

    -- 添加markdown文件的構(gòu)建
    add_files("src/*.md")
    add_files("src/*.markdown")

我們也可以指定某些零散的其他文件作為markdown規(guī)則來處理:

target("test")
    -- ...
    add_files("src/test/*.md.in", {rule = "markdown"})

注:通過add_files("*.md", {rule = "markdown"})方式指定的規(guī)則,優(yōu)先級(jí)高于add_rules("markdown")設(shè)置的規(guī)則乡范。

IDE工程文件生成

xmake提供了豐富的插件擴(kuò)展配名,其中vcproj, makefile等工程文件的生成就是作為插件提供,使用起來也非常簡(jiǎn)單:

$ xmake project -k vs2017 -m "debug,release"

即可生成帶有debug, release兩種編譯模式的vc工程晋辆,同時(shí)支持x86和x64渠脉。

生成的工程目錄結(jié)構(gòu)會(huì)根據(jù)添加的所有源文件的目錄結(jié)構(gòu),自動(dòng)分析生成直觀的文件樹瓶佳,方便vs去瀏覽查看芋膘。

makefile的生成如下:

$ xmake project -k makefile

后續(xù)會(huì)陸續(xù)更多其他工程文件,也歡迎大家來貢獻(xiàn)哦霸饲。

靈活簡(jiǎn)單的插件擴(kuò)展

上節(jié)的IDE工程文件生成为朋,在xmake中就是作為插件來提供,這樣更加方便擴(kuò)展厚脉,也能讓用戶快速定制自己的插件习寸,只需要定義個(gè)task插件任務(wù)就行了:

-- 定義一個(gè)名叫hello的插件任務(wù)
task("hello")

    -- 設(shè)置類型為插件
    set_category("plugin")

    -- 插件運(yùn)行的入口
    on_run(function ()
        print("hello xmake!")
    end)

    -- 設(shè)置插件的命令行選項(xiàng),這里沒有任何參數(shù)選項(xiàng)傻工,僅僅顯示插件描述
    set_menu {
                -- usage
                usage = "xmake hello [options]"

                -- description
            ,   description = "Hello xmake!"

                -- options
            ,   options = {}
            } 

上述代碼就是一個(gè)最為簡(jiǎn)單的hello xmake!插件融涣,運(yùn)行$xmake hello就可看到執(zhí)行輸出童番,set_menu用于配置插件命令行選項(xiàng),這個(gè)不設(shè)置就是內(nèi)部task威鹿,無法在命令行下調(diào)用剃斧。

更加詳細(xì)的插件說明以及內(nèi)置插件列表可參考文檔:插件手冊(cè)

查找依賴包

xmake參考了cmake對(duì)于find_*系列接口的設(shè)計(jì),實(shí)現(xiàn)在項(xiàng)目中動(dòng)態(tài)的查找和添加包依賴忽你。

target("test")
    set_kind("binary")
    add_files("*.c")
    on_load(function (target)
        import("lib.detect.find_package")
        target:add(find_package("zlib"))
    end)

上述描述代碼幼东,通過lib.detect.find_package來查找包,如果找到zlib包科雳,則將links, includedirs和linkdirs等信息添加到target中去根蟹。

交互式命令執(zhí)行(REPL)

有時(shí)候在交互模式下,運(yùn)行命令更加的方便測(cè)試和驗(yàn)證一些模塊和api糟秘,也更加的靈活简逮,不需要再去額外寫一個(gè)腳本文件來加載,不過我一般用來做計(jì)算器用用(好吧尿赚。散庶。)

# 不帶任何參數(shù)執(zhí)行,就可以進(jìn)入
$ xmake lua
>

# 進(jìn)行表達(dá)式計(jì)算
> 1 + 2
3

# 賦值和打印變量值
> a = 1
> a
1

# 多行輸入和執(zhí)行
> for _, v in pairs({1, 2, 3}) do
>> print(v)
>> end
1
2
3

我們也能夠通過 import 來導(dǎo)入擴(kuò)展模塊:

> task = import("core.project.task")
> task.run("hello")
hello xmake!

編譯環(huán)境支持

當(dāng)前xmake的最新版本已經(jīng)支持很多sdk環(huán)境的集成編譯凌净,例如:

  • [x] Visual Studio編譯環(huán)境
  • [x] mingw編譯環(huán)境
  • [x] cygwin編譯環(huán)境
  • [x] Android NDK編譯環(huán)境
  • [x] Xcode編譯環(huán)境(支持iPhoneos/Macosx構(gòu)建)
  • [x] 系統(tǒng)gcc/clang編譯環(huán)境
  • [x] 交叉工具鏈編譯環(huán)境
  • [x] Cuda編譯環(huán)境
  • [ ] Qt編譯環(huán)境(正在支持中)
  • [ ] Windows WDK編譯環(huán)境(正在支持中)

FAQ

xmake有哪些用途?

  1. 跨平臺(tái)維護(hù)和編譯C/C++項(xiàng)目
  2. CI上部署自動(dòng)化構(gòu)建
  3. 開源代碼的快速移植
  4. 臨時(shí)的測(cè)試代碼編寫和快速運(yùn)行
  5. 與自己喜歡的編輯器集成悲龟,打造屬于自己的C/C++開發(fā)環(huán)境
  6. 與其他native語言的混合編譯
  7. 嵌入式開發(fā)下的交叉編譯
  8. 提升逼格

對(duì)于第三點(diǎn)的用途,我平常用的最多冰寻,因?yàn)槲医?jīng)常需要移植第三方的開源項(xiàng)目须教,它們使用的構(gòu)建工具各不相同,有automake斩芭,cmake等等轻腺,其支持的構(gòu)建平臺(tái)力度也都不相同,經(jīng)常會(huì)遇到需要的平臺(tái)不支持的問題划乖。

沒辦法约计,只好自己敲makefile來移植代碼,然后適配自己需要支持的那些平臺(tái)迁筛,還有交叉工具鏈,很蛋疼耕挨,自從寫了xmake后细卧,我現(xiàn)在平常移植代碼方便了很多,效率提升非常明顯筒占。

怎樣看實(shí)時(shí)編譯警告信息?

為了避免刷屏贪庙,在構(gòu)建時(shí)候,默認(rèn)是不實(shí)時(shí)輸出警告信息的翰苫,如果想要看的話可以加上-w選項(xiàng)啟用編譯警告輸出就行了止邮。

$ xmake [-w|--warning] 

怎樣看詳細(xì)的編譯參數(shù)信息这橙?

請(qǐng)加上 -v 或者 --verbose 選項(xiàng)重新執(zhí)行xmake后,獲取更加詳細(xì)的輸出信息

例如:

$ xmake [-v|--verbose] 

如果加上 --backtrace 選項(xiàng)也可以獲取出錯(cuò)時(shí)的xmake的調(diào)試棧信息

$ xmake -v --backtrace
xmake-verbose

快速安裝

最后我們講下导披,如何安裝xmake屈扎,通常只需要一個(gè)腳本命令就能搞定。

一鍵安裝腳本

bash <(curl -fsSL https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.sh)

windows安裝包

對(duì)于windows用戶撩匕,提供了安裝包來快速安裝鹰晨,可到Github Releases上下載對(duì)應(yīng)版本。

更加詳細(xì)的安裝過程止毕,見相關(guān)文檔: 安裝說明

結(jié)語

xmake還有很多非常有用的特性模蜡,例如:編譯器特性檢測(cè)、豐富的模塊庫(kù)扁凛、依賴包管理忍疾、自定義選項(xiàng)等等,一篇文章講不完這么多谨朝,大家有興趣的話卤妒,可以去官方文檔里面看看,還有很多隱藏特性等著你哦叠必。

原文出處:http://tboox.org/cn/2018/03/26/build-project-so-simply/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荚孵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纬朝,更是在濱河造成了極大的恐慌收叶,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件共苛,死亡現(xiàn)場(chǎng)離奇詭異判没,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)隅茎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門澄峰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辟犀,你說我怎么就攤上這事俏竞。” “怎么了堂竟?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵魂毁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我出嘹,道長(zhǎng)席楚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任税稼,我火速辦了婚禮烦秩,結(jié)果婚禮上垮斯,老公的妹妹穿的比我還像新娘。我一直安慰自己只祠,他們只是感情好兜蠕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铆农,像睡著了一般牺氨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上墩剖,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天猴凹,我揣著相機(jī)與錄音,去河邊找鬼岭皂。 笑死郊霎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的爷绘。 我是一名探鬼主播书劝,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼土至!你這毒婦竟也來了购对?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤陶因,失蹤者是張志新(化名)和其女友劉穎骡苞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楷扬,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡解幽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烘苹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躲株。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖镣衡,靈堂內(nèi)的尸體忽然破棺而出霜定,到底是詐尸還是另有隱情,我是刑警寧澤廊鸥,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布望浩,位于F島的核電站,受9級(jí)特大地震影響黍图,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奴烙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一助被、第九天 我趴在偏房一處隱蔽的房頂上張望剖张。 院中可真熱鬧,春花似錦揩环、人聲如沸搔弄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)顾犹。三九已至,卻和暖如春褒墨,著一層夾襖步出監(jiān)牢的瞬間炫刷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工郁妈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浑玛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓噩咪,卻偏偏與公主長(zhǎng)得像顾彰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胃碾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • feisky云計(jì)算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,844評(píng)論 0 5
  • Android游戲開發(fā)實(shí)踐(1)之NDK與JNI開發(fā)02 承接上篇Android游戲開發(fā)實(shí)踐(1)之NDK與JNI...
    AlphaGL閱讀 3,750評(píng)論 0 24
  • C++少說也用了十年了,從簡(jiǎn)單的Hello World到200萬行的游戲項(xiàng)目咱扣,編譯和構(gòu)建的工具也經(jīng)歷了各種升級(jí)堵腹。最...
    davidpp閱讀 7,982評(píng)論 4 16
  • 昨晚我和娃爸鬧別扭了,是不值一提的小事儒旬,但因?yàn)樗膽B(tài)度讓我大大的生氣栏账,繼而萎靡不振。但是昨天答應(yīng)了橙橙去登山的話不...
    冰雪原野閱讀 448評(píng)論 1 3
  • 初見你栈源,清秀蛋臉蘊(yùn)紅光挡爵。再見你,柳眉掛眼含月亮甚垦。夢(mèng)見你茶鹃,婀娜身姿賽玉環(huán)。不見你艰亮,春夏秋冬都無顏闭翩。
    二爺是年輕人閱讀 274評(píng)論 2 2