CMake學習筆記(二)——CMake語法

搬運自本人 CSDN 博客:https://blog.csdn.net/ajianyingxiaoqinghan/article/details/70230902


CMake學習筆記(二)——CMake語法

上一篇學習筆記宽档,筆者簡單瀏覽了 CMake 官網(wǎng)提供的教程帕胆,但感覺并不系統(tǒng)探膊,而且對很多指令并沒有進行解釋,所以只寫了一半就放棄了……而且筆者英語也不好贱勃,索性還是直接在國內網(wǎng)站上找別人的總結辜御,然后自己綜合學一下吧……

參考地址:
http://www.cnblogs.com/ph829/p/4759124.html
http://blog.csdn.net/bytxl/article/details/50635016
http://blog.csdn.net/wzzfeitian/article/details/40963457/

前言:

1、每一個需要進行cmake操作的目錄下面,都必須存在文件<font color=red>CMakeLists.txt </font>溢十。
2、cmake指令<font color=red>不區(qū)分大小寫</font>达吞。本文為了醒目张弛,筆者把cmake指令都作大寫處理。
3酪劫、變量使用${}方式取值吞鸭,但是在 IF 控制語句中是直接使用變量名;
4覆糟、指令(參數(shù) 1 參數(shù) 2…)刻剥,參數(shù)使用括弧括起,參數(shù)之間使用空格或分號分開滩字;

一. CMake中常用預定義變量

1. CMake的預定義變量

  • PROJECT_SOURCE_DIR:工程根目錄造虏;
  • PROJECT_BINARY_DIR:運行cmake命令的目錄。筆者建議定義為${PROJECT_SOURCE_DIR}/build下麦箍。具體原因見后文外部編譯部分漓藕;
  • CMAKE_INCLUDE_PATH:環(huán)境變量,非cmake變量挟裂;
  • CMAKE_LIBRARY_PATH:環(huán)境變量享钞;
  • CMAKE_CURRENT_SOURCE_DIR:當前處理的CMakeLists.txt文件所在路徑;
  • CMAKE_CURRENT_BINARY_DIR:target編譯目錄诀蓉;
    • 使用ADD_SURDIRECTORY指令可以更改該變量的值栗竖;
    • SET(EXECUTABLE_OUTPUT_PATH < dir >) 指令不會對該變量有影響,但改變了最終目標文件的存儲路徑渠啤;
  • CMAKE_CURRENT_LIST_FILE:輸出調用該變量的CMakeLists.txt的完整路徑划滋;
  • CMAKE_CURRENT_LIST_LINE:輸出該變量所在的行;
  • CMAKE_MODULE_PATH:定義自己的cmake模塊所在路徑埃篓;
  • EXECUTABLE_OUTPUT_PATH:重新定義目標二進制可執(zhí)行文件的存放位置;
  • LIBRARY_OUTPUT_PATH:重新定義目標鏈接庫文件的存放位置根资;
  • PROJECT_NAME:返回由PROJECT指令定義的項目名稱架专;
  • CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS:用來控制IF...ELSE...語句的書寫方式同窘;

2. 系統(tǒng)信息預定義變量

  • CMAKE_MAJOR_VERSION cmake主版本號,如2.8.6中的2
  • CMAKE_MINOR_VERSION cmake次版本號,如2.8.6中的8
  • CMAKE_PATCH_VERSION cmake補丁等級,如2.8.6中的6
  • CMAKE_SYSTEM 系統(tǒng)名稱,例如Linux-2.6.22
  • CMAKE_SYSTEM_NAME 不包含版本的系統(tǒng)名,如Linux
  • CMAKE_SYSTEM_VERSION 系統(tǒng)版本,如2.6.22
  • CMAKE_SYSTEM_PROCESSOR 處理器名稱,如i686
  • UNIX 在所有的類UNIX平臺為TRUE,包括OS X和cygwin
  • WIN32 在所有的win32平臺為TRUE,包括cygwin

3. 開關選項

  • BUILD_SHARED_LIBS 控制默認的庫編譯方式。
    • 注:如果未進行設置,使用ADD_LIBRARY時又沒有指定庫類型,默認編譯生成的庫都是靜態(tài)庫部脚。
  • CMAKE_C_FLAGS 設置C編譯選項
  • CMAKE_CXX_FLAGS 設置C++編譯選項

二. CMake常用語法

1. CMAKE_MINIMUM_REQUIRED

該語句一般都可以放置在CMakeLists.txt的開頭想邦,用于說明CMake最低版本要求。
這行命令是可選的委刘,我們可以不寫這句話丧没,但在有些情況下,如果CMakeLists.txt文件中使用了一些高版本cmake特有的一些命令的時候锡移,就需要加上這樣一行呕童,提醒用戶升級到該版本之后再執(zhí)行cmake。

cmake_minimum_required (VERSION 2.6)

上述例程指cmake的最低版本至少為2.6淆珊。

2. PROJECT

格式:

PROJECT(name)
  • name:工程名稱夺饲;

該指令一般置于CMakeLists.txt的開頭,定義了工程的名稱施符。但項目最終編譯生成的可執(zhí)行文件并不一定是這個項目名稱往声,而是由另一條命令確定的,稍候我們再介紹戳吝。
執(zhí)行了該條指令之后浩销,將會自動創(chuàng)建兩個變量:

  • < projectname >_BINARY_DIR:二進制文件保存路徑;
  • < projectname >_SOURCE_DIR:源代碼路徑听哭;
project(CRNode)

執(zhí)行了上一條指令慢洋,即定義了一個項目名稱CRNode,相應的會生成兩個變量:CRNode_BINARY_DIR, CRNode_SOURCE_DIR欢唾。
cmake中預定義了兩個變量:PROJECT_BINARY_DIR與PROJECT_SOURCE_DIR且警。
在這個例子中:
PROJECT_BINARY_DIR = CRNode_BINARY_DIR
PROJECT_SOURCE_DIR = CRNode_SOURCE_DIR
筆者強烈推薦直接使用PROJECT_BINARY_DIR與PROJECT_SOURCE_DIR,這樣及時項目名稱發(fā)生了變化礁遣,也不會影響CMakeLists.txt文件斑芜。
關于上面兩個變量是否相同的問題,涉及到編譯方法是內部編譯還是外部編譯祟霍。如果是內部編譯杏头,則上面兩個變量相同;如果是外部編譯沸呐,則兩個變量不同醇王。此處對內部編譯與外部編譯做出介紹:

(1) 外部構建與內部構建

假設此時已經完成了CMakeLists.txt的編寫,在CMakeLists.txt所在目錄下崭添,有兩種執(zhí)行cmake的方法:

cmake ./
make

以及:

mkdir build
cd ./build
cmake ../
make

第一種方法是內部構建寓娩,第二種方法是外部構建。上述兩種方法中,最大不同在于cmake與make的工作路徑不同棘伴。
內部構建方法中寞埠,cmake生成的中間文件和可執(zhí)行文件都會存放在項目目錄中;外部構建方法中焊夸,中間文件與可執(zhí)行文件都存放在build目錄中仁连。
筆者強烈建議使用外部構建方法。優(yōu)點顯而易見:最大限度的保持了代碼目錄的整潔阱穗,生成饭冬、編譯與安裝是不同于項目目錄的其他目錄中,在外部構建方法下揪阶,PROJECT_SOURCE_DIR指向目錄與內部構建相同昌抠,為CMakeLists.txt所在根目錄;而PROJECT_BINARY_DIR不同遣钳,它指向CMakeLists.txt所在根目錄下的build目錄扰魂。

3. SET

格式:

SET(VAR [VALUE] [CACHE TYPEDOCSTRING [FORCE]])

例:

SET(CMAKE_INSTALL_PREFIX /usr/local)

該例程中,我們顯式的將CMAKE_INSTALL_PREFIX的值定義為/usr/local蕴茴,如此在外部構建情況下執(zhí)行make install命令時劝评,make會將生成的可執(zhí)行文件拷貝到/usr/local/bin目錄下。
當然倦淀,可執(zhí)行文件的安裝路徑CMAKE_INSTALL_PREFIX也可以在執(zhí)行cmake命令的時候指定蒋畜,cmake參數(shù)如下:

cmake -DCMAKE_INSTALL_PREFIX=/usr ..

如果cmake參數(shù)和CMakeLists.txt文件中都不指定該值的話,則該值為默認的/usr/local撞叽。

4. ADD_SUBDIRECTORY

格式:

ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
  • source_dir:源文件路徑姻成;
  • [binary_dir]:中間二進制與目標二進制存放路徑;
  • [EXECLUDE_FROM_ALL]:將這個目錄從編譯過程中排除愿棋;

這個指令用于向當前工程添加存放源文件的子目錄科展,并可以指定中間二進制和目標二進制存放的位置。EXCLUDE_FROM_ALL 參數(shù)的含義是將這個目錄從編譯過程中排除糠雨。比如才睹,工程有時候存在example,可能就需要工程構建完成后甘邀,再進入example目錄單獨進行構建琅攘。

5. INCLUDE_DIRECTORIES

格式:

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
  • [AFTER|BEFORE]:追加標志,指定控制追加或置前松邪;
  • [SYSTEM]:(筆者也不知道干嘛用的)
  • dir1, ..., dir n:添加的一系列頭文件搜索路徑坞琴;

向工程添加多個特定的頭文件搜索路徑,路徑之間用空格分隔逗抑。類似于gcc中的編譯參數(shù)<code>-l</code>剧辐,即指定編譯過程中編譯器搜索頭文件的路徑寒亥。當項目需要的頭文件不在系統(tǒng)默認的搜索路徑時,則指定該路徑荧关。
AFTER/BEFORE參數(shù)护盈,控制追加或置前。默認情況下羞酗,追加當前頭文件搜索路徑的后面。
注:如果路徑包含空格紊服,可以使用雙引號將它括起來檀轨。
例:

INCLUDE_DIRECTORIES(/usr/include/thrift)

6. ADD_EXECUTABLE

格式:

ADD_EXECUTABLE(exename srcname)
  • exename:可執(zhí)行文件名
  • srcname:生成該可執(zhí)行文件的源文件

該命令給出源文件名稱,并指出需要編譯出的可執(zhí)行文件名欺嗤。

例1:

ADD_EXECUTABLE(hello ${SRC_LIST})

上述例程說明SRC_LIST變量中的源文件参萄,需要編譯出名為hello的可執(zhí)行文件。

例2:

SET(SRC_LIST main.cc
        rpc/CRNode.cpp 
        rpc/Schd_types.cpp 
        task/TaskExecutor.cpp
        task/TaskMoniter.cpp
        util/Const.cpp 
        util/Globals.cc
        )
 
ADD_EXECUTABLE(CRNode ${SRC_LIST})

該例程中煎饼,定義了該工程會生成一個名為CRNode的可執(zhí)行文件讹挎,所依賴的源文件是變量SRC_LIST定義的源文件列表。
注:如果前文PROJECT()指令中定義的項目名稱也定義為CRNode吆玖,也沒有什么問題筒溃,兩者之間沒有任何關系。

7. ADD_LIBRARY

格式:

ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
  • libname:庫文件名稱沾乘;
  • [SHARED|STATIC|MODULE]:生成庫文件類型(共享庫/靜態(tài)庫)
  • [EXCLUDE_FROM_ALL]:表示該庫不會被默認構建
  • source1, ..., sourceN:生成庫所依賴的源文件

例:

ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

8. 變量EXECUTABLE_OUTPUT_PATH, LIBRARY_OUTPUT_PATH

EXECUTABLE_OUTPUT_PATH為生成可執(zhí)行文件路徑怜奖,LIBRARY_OUTPUT_PATH為生成庫文件路徑。
我們可以通過SET指令對其進行設置最終的目標二進制的位置翅阵,即最終生成的工程可執(zhí)行文件與最終的共享庫歪玲,而不包含編譯生成的中間文件。
命令如下:

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

注:指令ADD_EXECUTABLE, ADD_LIBRARY出現(xiàn)的位置掷匠,如果需要改變目標存放路徑滥崩,就在該處添加上述定義。

9. LINK_DIRECTORIES

格式:

LINK_DIRECTORIES(directory1 directory2 ...)

該指令用于添加外部庫的搜索路徑讹语。

10. TARGET_LINK_LIBRARIES

格式:

TARGET_LINK_LIBRARIES(target library1 <debug | optimized> library2 ..)
  • target:目標文件钙皮;
  • library1, ..., libraryN:鏈接外部庫文件;

指定鏈接目標文件時需要鏈接的外部庫募强,效果類似于gcc編譯參數(shù)<code>-L</code>株灸,解決外部庫依賴的問題。

11. MESSAGE

向終端輸出用戶定義的信息或變量值擎值;
格式:

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display” …)
  • SEND_ERROR:產生錯誤慌烧,生成過程被跳過;
  • STATUS:輸出前綴為 -- 的信息鸠儿;
  • FATAL_ERROR:立即終止所有cmake過程屹蚊;

12. SET_TARGET_PROPERTIES

設置目標的某些屬性厕氨,改變它們構建的方式。
格式:

SET_TARGET_PROPERTIES(target1 target2 ...
            PROPERTIES prop1 value1 prop2 value2 ...)

該指令為一個目標設置屬性汹粤,語法是列出所有用戶想要變更的文件命斧,然后提供想要設置的值。用戶可以使用任何想用的屬性與對應的值嘱兼,并在隨后的代碼中調用GET_TARGET_PROPERTY命令取出屬性的值国葬。
影響目標輸出文件的屬性<code>PROPERTIES</code>詳述如下:

(1) PREFIX, SUFFIX

PREFIX覆蓋了默認的目標名前綴(如lib);
SUFFIX覆蓋了默認的目標名后綴(如.so)芹壕。

(2) IMPORT_PREFIX, IMPORT_PREFIX

與PREFIX, SUFFIX是等價的屬性汇四,但針對的是DLL導入庫(即共享庫目標)。

(3) OUTPUT_NAME

構建目標時踢涌,OUTPUT_NAME用來設置目標的真實名稱通孽。

(4) LINK_FLAGS

為一個目標的鏈接階段添加額外標志。
LINK_FLAGS_< CONFIG >將為配置< CONFIG >添加鏈接標志睁壁,如DEBUG, RELEASE, MINSIZEREL, RELWITHDEBINFO背苦。

(5) COMPILE_FLAGS

設置附加的編譯器標志,在構建目標內的源文件時被用到潘明。

(6) LINKER_LANGUAGE

改變鏈接可執(zhí)行文件或共享庫的工具行剂。默認值是設置與庫中文件相匹配的語言。
CXX與C是該屬性的公共值钉疫。

(7) VERSION, SOVERSION

VERSION指定構建的版本號硼讽,SOVERSION指定構建的API版本號。
構建或安裝時牲阁,如果平臺支持符號鏈接固阁,且鏈接器支持so名稱,那么恰當?shù)姆栨溄訉粍?chuàng)建城菊。如果只指定兩者中的一個备燃,缺失的另一個假定為具有相同版本號。
例1:

SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")

例2:

SET_TARGET_PROPERTIES(hello PROPERTEIES VERSION 1.2 SOVERSION 1)

該指令用于控制版本凌唬,VERSION指代動態(tài)庫版本并齐,SOVERSION指代API版本。

13. AUX_SOURCE_DIRECTORY

查找某個路徑下的所有源文件客税,并將源文件列表存儲到一個變量中况褪。
格式:

AUX_SOURCE_DIRECTORY(< dir > < variable >)

例:

AUX_SOURCE_DIRECTORY(. SRC_LIST)

該指令將當前目錄下的文件列表全部存入變量SRC_LIST中。

14. INSTALL

INSTALL命令可以按照對象的不同分為三種類型:目標文件更耻、非目標文件测垛、目錄;

(1) 目標文件:

格式:

INSTALL(TARGETS targets...
    [[ARCHIVE|LIBRARY|RUNTIME]
    [DESTINATION < dir >]
    [PERMISSIONS permissions...]
    [CONFIGURATIONS
    [Debug|Release|...]]
    [COMPONENT < component >]
    [OPTIONAL]
    ] [...])
  • TARGETS targets:targets即為我們通過ADD_EXECUTABLE或ADD_LIBRARY定義的目標文件秧均,可能是可執(zhí)行二進制食侮,動態(tài)庫号涯,靜態(tài)庫;
  • DESTINATION < dir >:dir即為定義的安裝路徑锯七。安裝路徑可以是絕對/相對路徑链快,若如果路徑以/開頭,則是絕對路徑眉尸,且絕對路徑的情況下域蜗,CMAKE_INSTALL_PREFIX就無效了。
    • 注:如果希望使用CMAKE_INSTALL_PREFIX定義安裝路徑噪猾,就需要使用相對路徑地消,這時候安裝后的路徑就是<code>${CMAKE_INSTALL_PREFIX}/< dir ></code>

其余參數(shù)待筆者使用到再進行補充吧……

(2) 非目標文件:

.sh腳本文件,即為典型的非目標文件的可執(zhí)行程序畏妖。
格式:

INSTALL(PROGRAMS files... DESTINATION < dir >
    [PERMISSIONS permissions...]
    [CONFIGURATIONS [Debug|Release|...]]
    [COMPONENT < component >]
    [RENAME < name >] [OPTIONAL])

使用方法基本和上述目標文件指令的INSTALL相同,唯一別的不同是疼阔,安裝非目標文件之后的權限為OWNER_EXECUTE, GOUP_EXECUTE, WORLD_EXECUTE戒劫,即755權限目錄的安裝。

(3) 目錄:

格式:

INSTALL(DIRECTORY dirs... DESTINATION < dir >
    [FILE_PERMISSIONS permissions...]
    [DIRECTORY_PERMISSIONS permissions...]
    [USE_SOURCE_PERMISSIONS]
    [CONFIGURATIONS [Debug|Release|...]]
    [COMPONENT < component >]
    [[PATTERN < pattern > | REGEX < regex >]
    [EXCLUDE] [PERMISSIONS permissions...]] [...])
  • DIRECTORY dirs:dirs是所在源文件目錄的相對路徑婆廊。但必須注意:abc與abc/有很大區(qū)別:
    • 若是abc迅细,則該目錄將被安裝為目標路徑的abc;
    • 若是abc/淘邻,則代表將該目錄內容安裝到目標路徑茵典,但不包括該目錄本身。

例:

INSTALL(DIRECTORY icons scripts/ DESTINATION share/myproj
    PATTERN "CVS" EXCLUDE
    PATTERN "scripts/*" PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ)

該指令的執(zhí)行結果是:

  • 將icons目錄安裝到< prefix >/share/myproj宾舅;
  • 將scripts/中的內容安裝到< prefix >/share/myproj统阿;
  • 不包含目錄名為CVS的目錄;
  • 對于scripts/*文件指定權限為OWNER_EXECUTE, OWNER_WRITE, OWNER_READ, GROUP_EXECUT, GROUP_READ筹我;

三. 基本控制語法

1. IF

IF...ELSE...語法格式基本類似與C語言扶平,大致如下:

IF (expression)
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
ELSE (expression)
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
ENDIF (expression)

其中,一定要有ENDIF與IF對應蔬蕊。

(1) IF基本用法:

  • IF (expression), expression不為:空,0,N,NO,OFF,FALSE,NOTFOUND或< var >_NOTFOUND,為真结澄;
  • IF (not exp), 與上面相反;
  • IF (var1 AND var2)
  • IF (var1 OR var2)
  • IF (COMMAND cmd) 如果cmd確實是命令并可調用岸夯,為真麻献;
  • IF (EXISTS dir) 如果目錄存在,為真猜扮;
  • IF (EXISTS file) 如果文件存在勉吻,為真;
  • IF (file1 IS_NEWER_THAN file2)破镰,當file1比file2新餐曼,或file1/file2中有一個不存在時為真压储,文件名需使用全路徑;
  • IF (IS_DIRECTORY dir) 當dir是目錄時源譬,為真集惋;
  • IF (DEFINED var) 如果變量被定義,為真踩娘;
  • IF (var MATCHES regex) 此處var可以用var名刮刑,也可以用${var};
  • IF (string MATCHES regex) 當給定變量或字符串能匹配正則表達式regex時养渴,為真雷绢;
    • 例:
    • <code>IF ("hello" MATCHES "ell")
      MESSAGE("true")
      ENDIF ("hello" MATCHES "ell")
      </code>

(2) 數(shù)字比較表達式

  • IF (var LESS number)
  • IF (var GREATER number)
  • IF (var EQUAL number)

(3) 字母表順序比較

  • IF (var1 STRLESS var2)
  • IF (var1 STRGREATER var2)
  • IF (var1 STREQUAL var2)

例1:
判斷平臺差異:

IF(WIN32)
    MESSAGE(STATUS "This is windows.")
ELSE(WIN32)
    MESSAGE(STATUS "This is not windows.")
ENDIF(WIN32)

上述代碼可以控制不同平臺進行不同控制。

注:也許ELSE(WIN32)之類的語句閱讀起來很不舒服理卑,這時候可以加上語句:

SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)

這時候上述結構就可以寫成:

IF(WIN32)
ELSE()
ENDIF()

例2:
配合ELSEIF使用翘紊,不同平臺上的控制:

IF(WIN32)
    #do something related to WIN32
ELSEIF(UNIX)
    #do something related to UNIX
ELSEIF(APPLE)
    #do something related to APPLE
ENDIF (WIN32)

2. WHILE

語法結構如下:

WHILE(condition)
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
ENDWHILE(condition)

真假判斷條件可以參考IF指令。

3. FOREACH

FOREACH有三種使用形式的語法藐唠,且每個FOREACH都需要一個ENDFOREACH()與之匹配帆疟。

(1) 列表語法

FOREACH(loop_var arg1 arg2 ...)
     COMMAND1(ARGS ...)
     COMMAND2(ARGS ...)
 ...
ENDFOREACH(loop_var)

例:

AUX_SOURCE_DIRECTORY(. SRC_LIST)
FOREACH(F ${SRC_LIST})
     MESSAGE(${F})
ENDFOREACH(F)

該例程中,現(xiàn)將當前路徑下的所有源文件列表賦值給變量SRC_LIST宇立,然后遍歷SRC_LIST中的文件踪宠,并持續(xù)輸出信息,信息內容是當前路徑下所有源文件的名稱妈嘹。

(2) 范圍語法

FOREACH(loop_var RANGE total)
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
ENDFOREACH(loop_var)

例:

FOREACH(VAR RANGE 10)
   MESSAGE(${VAR})
ENDFOREACH(VAR)

該例程從0到total(此處為10)柳琢,以1為步進。此處輸出為:012345678910

(3) 范圍步進語法

FOREACH(loop_var RANGE start stop [step])
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
ENDFOREACH(loop_var)

從start開始润脸,到stop結束柬脸,以step為步進。
例:

FOREACH(A RANGE 5 15 3)
    MESSAGE(${A})
ENDFOREACH(A)

此處輸出為581114

后記:

差不多就這樣吧…… 筆者總結了三篇文章中的cmake語法毙驯,現(xiàn)在也需要試著自己寫cmake試一試了……
下一次再寫cmake學習筆記肖粮,應該就是把以前自己的項目用cmake配置一下試試了。
cmake學習結束之后尔苦,就是時候開始研究cmake生成的Makefile的語法了涩馆。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市允坚,隨后出現(xiàn)的幾起案子魂那,更是在濱河造成了極大的恐慌,老刑警劉巖稠项,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涯雅,死亡現(xiàn)場離奇詭異,居然都是意外死亡展运,警方通過查閱死者的電腦和手機活逆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門精刷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蔗候,你說我怎么就攤上這事怒允。” “怎么了锈遥?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵纫事,是天一觀的道長。 經常有香客問我所灸,道長丽惶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任爬立,我火速辦了婚禮钾唬,結果婚禮上,老公的妹妹穿的比我還像新娘侠驯。我一直安慰自己知纷,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布陵霉。 她就那樣靜靜地躺著,像睡著了一般伍绳。 火紅的嫁衣襯著肌膚如雪踊挠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天冲杀,我揣著相機與錄音效床,去河邊找鬼。 笑死权谁,一個胖子當著我的面吹牛剩檀,可吹牛的內容都是我干的。 我是一名探鬼主播旺芽,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼沪猴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了采章?” 一聲冷哼從身側響起运嗜,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悯舟,沒想到半個月后担租,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡抵怎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年奋救,在試婚紗的時候發(fā)現(xiàn)自己被綠了岭参。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡尝艘,死狀恐怖演侯,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情利耍,我是刑警寧澤蚌本,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站隘梨,受9級特大地震影響程癌,放射性物質發(fā)生泄漏。R本人自食惡果不足惜轴猎,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一嵌莉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捻脖,春花似錦锐峭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矛渴,卻和暖如春椎扬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背具温。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工蚕涤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铣猩。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓揖铜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親达皿。 傳聞我的和親對象是個殘疾皇子天吓,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容

  • 注:首發(fā)地址 1. 前言 當在做 Android NDK 開發(fā)時,如果不熟悉用 CMake 來構建峦椰,讀不懂 CMa...
    cfanr閱讀 24,257評論 1 53
  • CMake學習 參考自《Cmake Practice --Cjacker》 基本語法規(guī)則 變量的引用 變量使用${...
    techping閱讀 2,122評論 0 6
  • CMake學習 本篇分享一下有關CMake的一些學習心得以及相關使用失仁。 本文目錄如下: [1、CMake介紹] [...
    AlphaGL閱讀 12,219評論 11 79
  • 今天们何,天空萬里無云萄焦。 上午,品德課上,老師讓我們讀書或畫畫拂封。媽媽給我買的《上海尋寶記》和《三毛流浪記》兩本書同學們...
    李京芷閱讀 140評論 0 0
  • 方才在程序里看到一段JS代碼茬射,寫法極為高明,私心想著若是其按照規(guī)范來寫冒签,定可培養(yǎng)對這門語言的理解在抛,對JS編程能力提...
    百度怎么用閱讀 329評論 0 1