乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      CMake學(xué)習(xí)

       萬(wàn)書草堂 2018-04-12


      作者:AlphaGL。

      本文目錄如下:

      1、CMake介紹

      CMake全稱為“cross platform make”,是一個(gè)開(kāi)源的跨平臺(tái)自動(dòng)化構(gòu)建系統(tǒng)。使用指定名為CMakeLists.txt的配置文件可以控制軟件的構(gòu)建、測(cè)試和打包等流程。同時(shí),通過(guò)編寫平臺(tái)無(wú)關(guān)的CMakeLists.txt文件和需要簡(jiǎn)單的配置,CMake就能生成對(duì)應(yīng)目標(biāo)平臺(tái)的構(gòu)建文件,例如:類Unix系統(tǒng)的makefile文件、Windows的Visual Studio工程或者M(jìn)ac的Xcode工程,大大簡(jiǎn)化了跨平臺(tái)和交叉編譯方面的工作。

      當(dāng)然,類似的make工具也很多,Autocof、JAM、QMake、SCons甚至ANT,目的都是指定一套規(guī)則來(lái)簡(jiǎn)化整個(gè)構(gòu)建編譯流程。CMake工具鏈簡(jiǎn)單、靈活,且跨平臺(tái),很多知名項(xiàng)目都在使用CMake構(gòu)建。適合以C、C++或者java等編譯語(yǔ)言的項(xiàng)目。

      2、CMake安裝與使用

      2.1 CMake的安裝

      CMake下載地址為:
      https:///download/

      2.2 CMake-gui的使用

      CMake的安裝過(guò)程很簡(jiǎn)單,這里就不再贅述了。其中CMake提供帶GUI界面的工具cmake-gui。本文主要是以命令行的形式來(lái)講述CMake的使用,這里就稍微提一下cmake-gui的使用。原理都是差不多的。

      簡(jiǎn)述操作步驟如下:
      1、在本地目錄新建cmake文件夾(例如:我的目錄為E:\workplace\cmake),并在cmake目錄中創(chuàng)建bin目錄用于存放構(gòu)建過(guò)程中產(chǎn)生的臨時(shí)文件和目標(biāo)文件(例如:我的目錄為E:\workplace\cmake\bin)。

      2、在cmake目錄中新建hello_cmake.cCMakeLists.txt文件,內(nèi)容如下:
      hello_cmake.c

      #include <stdio.h>
      
      int main() {
          printf("Hello CMake\n");
          return 0;
      }

      CMakeLists.txt

      cmake_minimum_required (VERSION 2.8)
      project (HelloCMake)
      add_executable(HelloCMake hello_cmake.c)

      3、運(yùn)行cmake-gui,會(huì)打開(kāi)如下界面:

      (1)源碼所在的路徑,即CMakeLists.txt所在的路徑。本例為E:\workplace\cmake
      (2)構(gòu)建過(guò)程中產(chǎn)生的文件的路徑。本例為:E:\workplace\cmake\bin,注意這個(gè)路徑可以與(1)路徑相同,但若項(xiàng)目很大產(chǎn)生的文件很多要執(zhí)行清理等操作時(shí)會(huì)比較麻煩。
      (3)執(zhí)行configure。


      這里指定生成的構(gòu)建工程為VS2012的項(xiàng)目工程。點(diǎn)擊Finish即可自動(dòng)編譯,并生成對(duì)應(yīng)的*.sln的項(xiàng)目文件。

      在Visual Studio中打開(kāi)該項(xiàng)目,并執(zhí)行??梢钥吹秸_輸出了"Hello CMake"。

      2.3 CMake命令行的使用

      這里,依然使用剛才的示例來(lái)說(shuō)明下CMake命令行的方式的使用(清理bin目錄下的文件即可),使用步驟如下:
      (1)將CMake安裝路徑添加到Path環(huán)境變量中。Mac版本可以終端中輸入命令:export PATH=/Applications/CMake.app/Contents/bin:$PATH即可。

      (2)在Windows命令行中執(zhí)行如下命令:

      在當(dāng)前構(gòu)建的路徑,執(zhí)行cmake,cmake后面參數(shù)為CMakeLists.txt所在路徑,-G用來(lái)指定構(gòu)建生成目標(biāo)平臺(tái)的項(xiàng)目工程。分別對(duì)應(yīng)上面的GUI的操作。

      (3)在類Unix的操作系統(tǒng)中,可以執(zhí)行如下操作。這里我還是用的上面的示例代碼,我用Cygwin模擬下對(duì)應(yīng)的cmake操作,如圖:

      在Cygwin中新版的CMake會(huì)報(bào)警告(在32位Windows系統(tǒng)上則會(huì)報(bào)錯(cuò))。

      由此可見(jiàn),在Unix系列的操作系統(tǒng)上,使用CMake步驟分為:

      1. 編寫CMakeLists.txt配置文件。
      2. 執(zhí)行cmake命令生成makefile文件。
      3. 執(zhí)行make命令編譯執(zhí)行,生成最終的目標(biāo)文件。
      4. 運(yùn)行最終生成的可執(zhí)行文件即可,這步可選。
      2.4 CMake命令行說(shuō)明

      CMake命令行的選項(xiàng)可以在命令行終端上,輸入cmake --help查看。更詳盡的解釋可以查看CMake的官方手冊(cè)。

      cmake幫助手冊(cè)

      CMake命令行格式為:

      (1) cmake [<options>] (<path-to-source> | <path-to-existing-build>)  
      (2) cmake [(-D <var>=<value>)...] -P <cmake-script-file>  
      (3) cmake --build <dir> [<options>...] [-- <build-tool-options>...]  
      (4) cmake -E <command> [<options>...]  
      (5) cmake --find-package <options>...  

      常見(jiàn)的使用方式是第一種。這里也主要介紹這種方式。
      (1)[<options>],表示option為可選的。path-to-sourcepath-to-existing-build二選一,分別表示一個(gè)CMakeLists.txt所在的路徑和一個(gè)已存在的構(gòu)建工程所在的路徑。例如:

      cmake .

      這里option為空,構(gòu)建的路徑為用戶所在的當(dāng)前路徑。

      其中option常用的有:
      -G <generator-name>
      指定構(gòu)建系統(tǒng)生成器,當(dāng)前平臺(tái)所支持的generator-name可以通過(guò)幫助手冊(cè)查看。例如: cmake -G "Visual Studio 11 2012" E:\workplace\cmake,生成VS2012的構(gòu)建工程。

      -D <var>:<type>=<value>, -D <var>=<value>
      添加變量及值到CMakeCache.txt中。例如:cmake -D EXECUTABLE_OUTPUT_PATH="bin" .,會(huì)在CMakeCache.txt中添加一條

      //No help, variable specified on the command line.
      EXECUTABLE_OUTPUT_PATH:UNINITIALIZED=bin

      這樣,可以在CMakeLists.txt文件中讀取該變量的值。例如:message(${EXECUTABLE_OUTPUT_PATH})

      -U <globbing_expr>
      此選項(xiàng)可用于從CMakeCache.txt文件中刪除一個(gè)或多個(gè)變量,支持使用*?的匹配。與-D對(duì)應(yīng),使用是須謹(jǐn)慎,可能會(huì)導(dǎo)致CMakeCache.txt不工作。

      -i
      以向?qū)У姆绞竭\(yùn)行CMake。此選項(xiàng)會(huì)彈出一系列的提示,要求用戶回答關(guān)于工程配置的一些問(wèn)題。這些結(jié)果會(huì)被用來(lái)設(shè)置cmake的緩存值。注意,新版的CMake可能不再支持此選項(xiàng)。

      -E
      CMake命令行模式。CMake提供了一系列與平臺(tái)無(wú)關(guān)的命令。例如:copymake_directory,echo等,更多詳細(xì)參見(jiàn)cmake -E help。

      3、CMake語(yǔ)法及CMakeLists.txt編寫

      用CMake構(gòu)建一個(gè)項(xiàng)目工程,是通過(guò)一個(gè)或多個(gè)CMakeLists.txt文件來(lái)控制的。CMakeLists.txt中包含一系列命令來(lái)描述需要執(zhí)行的構(gòu)建。

      3.1 CMake語(yǔ)法

      在CMakeLists.txt中的命令的語(yǔ)法,都是形如下面這種格式:

      command (args...)

      command:是命令的名字。
      args:是參數(shù)的列表。多個(gè)參數(shù)使用空格隔開(kāi)。

      3.1.1 常用的命令

      cmake_minimum_required
      設(shè)置項(xiàng)目要求的CMake最低版本號(hào),如果當(dāng)前版本的CMake低于所需的值,它將停止處理項(xiàng)目并報(bào)告錯(cuò)誤。注意在project之前調(diào)用該命令,一般在CMakeLists.txt文件開(kāi)頭調(diào)用。命令格式為:

      cmake_minimum_required(VERSION major.minor[.patch[.tweak]]
                             [FATAL_ERROR])

      使用示例:

      cmake_minimum_required(VERSION 2.8.5)

      add_custom_command
      該命令可以為生成的構(gòu)建系統(tǒng)添加一條自定義的構(gòu)建規(guī)則。這里又包含兩種使用方式,一種是通過(guò)自定義命令在構(gòu)建中生成輸出文件,另外一種是向構(gòu)建目標(biāo)添加自定義命令。命令格式分別為:
      (1)生成文件

      add_custom_command(OUTPUT output1 [output2 ...]
                         COMMAND command1 [ARGS] [args1...]
                         [COMMAND command2 [ARGS] [args2...] ...]
                         [MAIN_DEPENDENCY depend]
                         [DEPENDS [depends...]]
                         [BYPRODUCTS [files...]]
                         [IMPLICIT_DEPENDS <lang1> depend1
                                          [<lang2> depend2] ...]
                         [WORKING_DIRECTORY dir]
                         [COMMENT comment]
                         [DEPFILE depfile]
                         [VERBATIM] [APPEND] [USES_TERMINAL])

      參數(shù)介紹:
      OUTPUT:
      指定命令預(yù)期產(chǎn)生的輸出文件。如果輸出文件的名稱是相對(duì)路徑,即相對(duì)于當(dāng)前的構(gòu)建的源目錄路徑。輸出文件可以指定多個(gè)output1,output2(可選)等。

      COMMAND:
      指定要在構(gòu)建時(shí)執(zhí)行的命令行。如果指定多個(gè)COMMAND,它們講按順心執(zhí)行。ARGS參數(shù)是為了向后兼容,為可選參數(shù)。args1和args2為參數(shù),多個(gè)參數(shù)用空格隔開(kāi)。

      MAIN_DEPENDENCY:
      可選命令,指定命令的主要輸入源文件。

      DEPENDS:
      指定命令所依賴的文件。

      BYPRODUCTS:
      可選命令,指定命令預(yù)期產(chǎn)生的文件,但其修改時(shí)間可能會(huì)比依賴性更新,也可能不會(huì)更新。

      IMPLICIT_DEPENDS:
      可選命令,請(qǐng)求掃描輸入文件的隱式依賴關(guān)系。給定的語(yǔ)言指定應(yīng)使用相應(yīng)的依賴性掃描器的編程語(yǔ)言。目前只支持C和CXX語(yǔ)言掃描器。必須為IMPLICIT_DEPENDS列表中的每個(gè)文件指定語(yǔ)言。從掃描中發(fā)現(xiàn)的依賴關(guān)系在構(gòu)建時(shí)添加到自定義命令的依賴關(guān)系。請(qǐng)注意,IMPLICIT_DEPENDS選項(xiàng)目前僅支持Makefile生成器,并且將被其他生成器忽略。

      WORKING_DIRECTORY:
      可選命令,使用給定的當(dāng)前工作目錄執(zhí)行命令。如果它是相對(duì)路徑,它將相對(duì)于對(duì)應(yīng)于當(dāng)前源目錄的構(gòu)建樹(shù)目錄。

      COMMENT:
      可選命令,在構(gòu)建時(shí)執(zhí)行命令之前顯示給定消息。

      DEPFILE:
      可選命令,為Ninja生成器指定一個(gè).d depfile。 .d文件保存通常由自定義命令本身發(fā)出的依賴關(guān)系。對(duì)其他生成器使用DEPFILE是一個(gè)錯(cuò)誤。

      使用實(shí)例:

      add_executable(MakeTable MakeTable.cxx) 
      add_custom_command (
        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h
        COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h
        DEPENDS MakeTable
        COMMENT "This is a test"
        )

      (2)自定義構(gòu)建事件

      add_custom_command(TARGET <target>
                         PRE_BUILD | PRE_LINK | POST_BUILD
                         COMMAND command1 [ARGS] [args1...]
                         [COMMAND command2 [ARGS] [args2...] ...]
                         [BYPRODUCTS [files...]]
                         [WORKING_DIRECTORY dir]
                         [COMMENT comment]
                         [VERBATIM] [USES_TERMINAL])

      參數(shù)介紹:
      TARGET:
      定義了與構(gòu)建指定相關(guān)聯(lián)的新命令。當(dāng)已經(jīng)存在是,相應(yīng)的command將不再執(zhí)行。

      PRE_BUILD:
      在目標(biāo)中執(zhí)行任何其他規(guī)則之前運(yùn)行。這僅在Visual Studio 7或更高版本上受支持。對(duì)于所有其他生成器PRE_BUILD將被視為PRE_LINK。

      PRE_LINK:
      在編譯源之后運(yùn)行,但在鏈接二進(jìn)制文件或運(yùn)行靜態(tài)庫(kù)的庫(kù)管理器或存檔器工具之前運(yùn)行。

      POST_BUILD:
      在目標(biāo)中的所有其他規(guī)則都已執(zhí)行后運(yùn)行。

      使用實(shí)例:

        add_custom_command(TARGET ${APP_NAME} 
                   PRE_BUILD
                           COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/Resources ${CMAKE_CURRENT_BINARY_DIR})

      add_custom_target
      該命令可以給指定名稱的目標(biāo)執(zhí)行指定的命令,該目標(biāo)沒(méi)有輸出文件,并始終被構(gòu)建。命令的格式為:

      add_custom_target(Name [ALL] [command1 [args1...]]
                        [COMMAND command2 [args2...] ...]
                        [DEPENDS depend depend depend ... ]
                        [BYPRODUCTS [files...]]
                        [WORKING_DIRECTORY dir]
                        [COMMENT comment]
                        [VERBATIM] [USES_TERMINAL]
                        [SOURCES src1 [src2...]])

      參數(shù)介紹(上面介紹過(guò)含義相同的參數(shù),這里就不再贅述了):
      Name:
      指定目標(biāo)的名稱。

      ALL:
      表明此目標(biāo)應(yīng)添加到默認(rèn)構(gòu)建目標(biāo),以便每次都將運(yùn)行(該命令名稱不能為ALL)

      SOURCES:
      指定要包括在自定義目標(biāo)中的其他源文件。指定的源文件將被添加到IDE項(xiàng)目文件中,以方便編輯,即使它們沒(méi)有構(gòu)建規(guī)則。

      使用示例:

      add_custom_target(APP ALL
            DEPENDS ${APP_NAME} # 依賴add_custom_command輸出的jar包
            COMMENT "building cassdk_jni.jar"
          )

      add_definitions
      為源文件的編譯添加由-D引入的宏定義。命令格式為:

      add_definitions(-DFOO -DBAR ...)

      使用示例:

      add_definitions(-DWIN32)

      add_dependencies
      使頂級(jí)目標(biāo)依賴于其他頂級(jí)目標(biāo),以確保它們?cè)谠撃繕?biāo)之前構(gòu)建。這里的頂級(jí)目標(biāo)是由add_executable,add_libraryadd_custom_target命令之一創(chuàng)建的目標(biāo)。
      使用示例:

      add_custom_target(mylib DEPENDS ${MYLIB})
      add_executable(${APP_NAME} ${SRC_LIST})
      add_dependencies(${APP_NAME} mylib)

      add_executable
      使用指定的源文件給項(xiàng)目添加一個(gè)可執(zhí)行文件。命令格式為:

      add_executable(<name> [WIN32] [MACOSX_BUNDLE]
                     [EXCLUDE_FROM_ALL]
                     source1 [source2 ...])

      參數(shù)介紹:
      name:
      該命令調(diào)用列出的源文件來(lái)構(gòu)建的可執(zhí)行目標(biāo)。 對(duì)應(yīng)于邏輯目標(biāo)名稱,在項(xiàng)目中必須是全局唯一的。構(gòu)建的可執(zhí)行文件的實(shí)際文件名是基于本機(jī)平臺(tái)的約定。

      WIN32:
      如果給出WIN32,則在創(chuàng)建的目標(biāo)上設(shè)置屬性WIN32_EXECUTABLE。

      MACOSX_BUNDLE:
      如果給定MACOSX_BUNDLE,將在創(chuàng)建的目標(biāo)上設(shè)置相應(yīng)的屬性。

      EXCLUDE_FROM_ALL:
      如果給定EXCLUDE_FROM_ALL,將在創(chuàng)建的目標(biāo)上設(shè)置相應(yīng)的屬性。

      source:
      源碼列表。

      使用示例:

      add_executable(HelloCMake hello_cmake.c)

      add_library
      使用指定的源文件給項(xiàng)目添加一個(gè)庫(kù)。命令格式為:

      add_library(<name> [STATIC | SHARED | MODULE]
                  [EXCLUDE_FROM_ALL]
                  source1 [source2 ...])

      參數(shù)介紹:
      name:
      該命令調(diào)用列出的源文件來(lái)構(gòu)建的庫(kù)目標(biāo)對(duì)應(yīng)于邏輯目標(biāo)名稱,在項(xiàng)目中必須是全局唯一的。

      STATIC:
      靜態(tài)庫(kù),在鏈接其他目標(biāo)時(shí)使用。

      SHARED:
      動(dòng)態(tài)鏈接庫(kù),運(yùn)行時(shí)加載。

      MODULE:
      不會(huì)被鏈接到其它目標(biāo)中,但是可能會(huì)在運(yùn)行時(shí)使用dlopen-系列的函數(shù)動(dòng)態(tài)鏈接。

      使用示例:

      add_library(HelloCMake hello_cmake.c)

      add_subdirectory:
      向構(gòu)建中添加子目錄。命令格式為:

      add_subdirectory(source_dir [binary_dir]
                       [EXCLUDE_FROM_ALL])

      使用示例:

      add_subdirectory(${SRC_ROOT})

      aux_source_directory
      查找目錄中的所有源文件。命令格式為:

      aux_source_directory(<dir> <variable>)

      查找指定目錄dir中所有源文件的名稱,并將列表存儲(chǔ)在提供的variable中。

      使用示例:

      aux_source_directory(. DIR_SRCS)
      add_executable(${APP_NAME} ${DIR_SRCS})

      configure_file
      將文件復(fù)制到其他位置并修改其內(nèi)容。命令格式為:

      configure_file(<input> <output>
                     [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
                     [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])

      使用示例:

      configure_file (
        "${PROJECT_SOURCE_DIR}/Config.h.in"
        "${PROJECT_BINARY_DIR}/Config.h"
        )

      file
      文件操作相關(guān)的命令。命令格式為:

      file(WRITE <filename> <content>...)
      file(APPEND <filename> <content>...)
      file(READ <filename> <variable>
           [OFFSET <offset>] [LIMIT <max-in>] [HEX])
      file(STRINGS <filename> <variable> [<options>...])
      file(<MD5|SHA1|SHA224|SHA256|SHA384|SHA512> <filename> <variable>)
      file(GLOB <variable>
           [LIST_DIRECTORIES true|false] [RELATIVE <path>]
           [<globbing-expressions>...])
      file(GLOB_RECURSE <variable> [FOLLOW_SYMLINKS]
           [LIST_DIRECTORIES true|false] [RELATIVE <path>]
           [<globbing-expressions>...])
      file(RENAME <oldname> <newname>)
      file(REMOVE [<files>...])
      file(REMOVE_RECURSE [<files>...])
      file(MAKE_DIRECTORY [<directories>...])
      file(RELATIVE_PATH <variable> <directory> <file>)
      file(TO_CMAKE_PATH "<path>" <variable>)
      file(TO_NATIVE_PATH "<path>" <variable>)
      file(DOWNLOAD <url> <file> [<options>...])
      file(UPLOAD   <file> <url> [<options>...])
      file(TIMESTAMP <filename> <variable> [<format>] [UTC])
      file(GENERATE OUTPUT output-file
           <INPUT input-file|CONTENT content>
           [CONDITION expression])
      file(<COPY|INSTALL> <files>... DESTINATION <dir>
           [FILE_PERMISSIONS <permissions>...]
           [DIRECTORY_PERMISSIONS <permissions>...]
           [NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS]
           [FILES_MATCHING]
           [[PATTERN <pattern> | REGEX <regex>]
            [EXCLUDE] [PERMISSIONS <permissions>...]] [...])
      file(LOCK <path> [DIRECTORY] [RELEASE]
           [GUARD <FUNCTION|FILE|PROCESS>]
           [RESULT_VARIABLE <variable>]
           [TIMEOUT <seconds>])

      以上都是文件相關(guān)的操作,這里就不詳細(xì)解釋。
      使用示例為:

      # 查找src目錄下所有以hello開(kāi)頭的文件并保存到SRC_FILES變量里
      file(GLOB SRC_FILES "src/hello*")
      # 遞歸查找
      file(GLOB_RECURSE SRC_FILES "src/hello*")

      find_file
      查找一個(gè)文件的完整路徑。命令格式為:

      find_file (<VAR> name1 [path1 path2 ...])

      使用示例:

      find_file(HELLO_H hello.h)

      find_library
      查找一個(gè)庫(kù)文件。命令格式為:

      find_library (<VAR> name1 [path1 path2 ...])

      使用示例:

      find_library(LUA lua5.1 /usr/lib /lib)

      find_package
      查找并加載外部項(xiàng)目的設(shè)置。命令格式為:

      find_package(<package> [version] [EXACT] [QUIET] [MODULE]
                   [REQUIRED] [[COMPONENTS] [components...]]
                   [OPTIONAL_COMPONENTS components...]
                   [NO_POLICY_SCOPE])

      使用示例為:

      find_package(Protobuf)

      find_path
      查找包含某個(gè)文件的路徑。命令格式為:

      find_path (<VAR> name1 [path1 path2 ...])

      使用示例:

      find_path(DIR_SRCS hello.h .)

      include_directories
      將給定的目錄添加到編譯器用于搜索包含文件的目錄。相對(duì)路徑則相對(duì)于當(dāng)前源目錄。命令格式為:

      include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

      使用示例:

      include_directories(
        ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/cocos
        ${CMAKE_CURRENT_SOURCE_DIR}/cocos/platform
        ${CMAKE_CURRENT_SOURCE_DIR}/extensions
        ${CMAKE_CURRENT_SOURCE_DIR}/external
      )

      include
      包含其他目錄的CMakeLists.txt文件。命令格式為:

      include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>]
                            [NO_POLICY_SCOPE])

      使用示例:

      include(platform/CMakeLists.txt)

      link_directories
      指定鏈接器查找?guī)斓穆窂?。命令格式為?/p>

      link_directories(directory1 directory2 ...)

      使用示例:

      link_directories(${PROJECT_SOURCE_DIR}/lib)

      list
      列表相關(guān)的操作。命令格式為:

      list(LENGTH <list> <output variable>)
      list(GET <list> <element index> [<element index> ...]
           <output variable>)
      list(APPEND <list> [<element> ...])
      list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)
      list(FIND <list> <value> <output variable>)
      list(INSERT <list> <element_index> <element> [<element> ...])
      list(REMOVE_ITEM <list> <value> [<value> ...])
      list(REMOVE_AT <list> <index> [<index> ...])
      list(REMOVE_DUPLICATES <list>)
      list(REVERSE <list>)
      list(SORT <list>)

      使用示例:

      list(APPEND SRC_LIST
          ${PROTO_SRC}
      )

      message
      向用戶顯示消息。命令格式為:

      message([<mode>] "message to display" ...)

      參數(shù)說(shuō)明:
      mode:
      可選的值為none,STATUS,WARNING,AUTHOR_WARNING,SEND_ERROR,F(xiàn)ATAL_ERROR,DEPRECATION。
      使用示例:

      message(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})

      option
      提供用戶可以選擇的選項(xiàng)。命令格式為:

      option(<option_variable> "help string describing option"
             [initial value])

      使用示例:

      option (USE_MYMATH "Use tutorial provided math implementation" ON) 

      project
      為整個(gè)工程設(shè)置一個(gè)工程名。命令格式為:

      project(<PROJECT-NAME> [LANGUAGES] [<language-name>...])
      project(<PROJECT-NAME>
              [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
              [LANGUAGES <language-name>...])

      使用示例:

      project (HelloCMake)

      set
      將一個(gè)CMAKE變量設(shè)置為給定值。命令格式為:

      set(<variable> <value>... [PARENT_SCOPE])

      使用示例:

      set(COCOS2D_ROOT ${CMAKE_SOURCE_DIR}/cocos2d)

      set_target_properties
      設(shè)置目標(biāo)的一些屬性來(lái)改變它們構(gòu)建的方式。命令格式為:

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

      使用示例為:

      set_target_properties(cocos2d
          PROPERTIES
          ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
          LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
          VERSION "${COCOS2D_X_VERSION}"
      )

      string
      字符串相關(guān)操作。命令格式為:

      string(FIND <string> <substring> <output variable> [REVERSE])
      string(REPLACE <match_string>
             <replace_string> <output variable>
             <input> [<input>...])
      string(REGEX MATCH <regular_expression>
             <output variable> <input> [<input>...])
      string(REGEX MATCHALL <regular_expression>
             <output variable> <input> [<input>...])
      string(REGEX REPLACE <regular_expression>
             <replace_expression> <output variable>
             <input> [<input>...])
      string(APPEND <string variable> [<input>...])
      string(CONCAT <output variable> [<input>...])
      string(TOLOWER <string1> <output variable>) 
      string(TOUPPER <string1> <output variable>)
      string(LENGTH <string> <output variable>)
      string(SUBSTRING <string> <begin> <length> <output variable>)
      string(STRIP <string> <output variable>)
      string(GENEX_STRIP <input string> <output variable>)  
      string(COMPARE LESS <string1> <string2> <output variable>)
      string(COMPARE GREATER <string1> <string2> <output variable>)
      string(COMPARE EQUAL <string1> <string2> <output variable>)
      string(COMPARE NOTEQUAL <string1> <string2> <output variable>)
      string(COMPARE LESS_EQUAL <string1> <string2> <output variable>)
      string(COMPARE GREATER_EQUAL <string1> <string2> <output variable>)
      string(<MD5|SHA1|SHA224|SHA256|SHA384|SHA512>
             <output variable> <input>)
      string(ASCII <number> [<number> ...] <output variable>)
      string(CONFIGURE <string1> <output variable>
             [@ONLY] [ESCAPE_QUOTES])
      string(RANDOM [LENGTH <length>] [ALPHABET <alphabet>]
             [RANDOM_SEED <seed>] <output variable>)
      string(TIMESTAMP <output variable> [<format string>] [UTC])
      string(MAKE_C_IDENTIFIER <input string> <output variable>)
      string(UUID <output variable> NAMESPACE <namespace> NAME <name>
             TYPE <MD5|SHA1> [UPPER])

      使用示例:

      string(REPLACE "${PROJECT_SOURCE_DIR}/hello.c" "" DIR_SRCS "${DIR_ROOT}")

      target_link_libraries
      將給定的庫(kù)鏈接到一個(gè)目標(biāo)上。命令格式為:

      target_link_libraries(<target> ... <item>... ...)

      使用示例:

      target_link_libraries(luacocos2d cocos2d)
      3.1.2 常用的變量

      使用${}進(jìn)行變量的引用。例如:message(${Hello_VERSION}),Hello為工程名。CMake提供了很多有用的變量。以下僅列舉常用的變量:

      CMAKE_BINARY_DIR
      構(gòu)建樹(shù)的頂層路徑

      CMAKE_COMMAND
      指向CMake可執(zhí)行文件的完整路徑

      CMAKE_CURRENT_BINARY_DIR
      當(dāng)前正在被處理的二進(jìn)制目錄的路徑。

      CMAKE_CURRENT_SOURCE_DIR
      指向正在被處理的源碼目錄的路徑。

      CMAKE_HOME_DIRECTORY
      指向源碼樹(shù)頂層的路徑。

      CMAKE_PROJECT_NAME
      當(dāng)前工程的工程名。

      CMAKE_ROOT
      CMake的安裝路徑。

      CMAKE_SOURCE_DIR
      源碼樹(shù)的頂層路徑。

      CMAKE_VERSION
      cmake的完整版本號(hào)。

      PROJECT_BINARY_DIR
      指向當(dāng)前編譯工程構(gòu)建的全路徑。

      <PROJECT-NAME>_BINARY_DIR
      指向當(dāng)前編譯工程構(gòu)建的全路徑。

      <PROJECT-NAME>_SOURCE_DIR
      指向構(gòu)建工程的全路徑。

      PROJECT_SOURCE_DIR
      指向構(gòu)建工程的全路徑。

      PROJECT_NAME
      project命令傳遞的工程名參數(shù)。

      <PROJECT-NAME>_VERSION
      項(xiàng)目的完整版本號(hào)。

      3.2 CMakeLists.txt編寫

      有了上面的基礎(chǔ),再編寫CMakeLists.txt自然會(huì)事半功倍。下面,以幾個(gè)小實(shí)例來(lái)說(shuō)下通過(guò)CMakeLists.txt的來(lái)構(gòu)建項(xiàng)目。

      這里cJSON庫(kù)為例來(lái)說(shuō)明下CMakeLists.txt的寫法。當(dāng)然,這里的代碼并嚴(yán)謹(jǐn),僅用來(lái)演示CMakeList的用法。

      3.2.1 將cJSON構(gòu)建為靜態(tài)庫(kù)

      (1)在本地建立cJSONdemo1的目錄工程,并將cJSON庫(kù)源代碼拷貝到目錄中,并在該目錄新建CMakeLists.txt文件。目錄結(jié)構(gòu)如下:

      cJSONdemo1  
      ├── cJSON_Utils.h  
      ├── cJSON_Utils.c  
      ├── cJSON.h
      ├── cJSON.c
      └── CMakeLists.txt 

      CMakeLists.txt文件內(nèi)容如下:

      cmake_minimum_required(VERSION 2.8.5)
      project(cJSON-lib)
      set(CJSON_SRC cJSON.c cJSON_Utils.c)
      add_library(cjson STATIC ${CJSON_SRC})

      在終端下執(zhí)行如下操作:

      (2)自動(dòng)搜索目錄源碼
      在上面cJSONdemo1的基礎(chǔ)上做一些改進(jìn)。前面提過(guò)set(<variable> <value>...),可以預(yù)見(jiàn)在cJSON庫(kù)源碼越來(lái)越多的情況下,會(huì)變成這樣:

      set(CJSON_SRC cJSON.c cJSON1.c cJSON2.c cJSON3.c cJSON4.c cJSON5.c)

      這樣,源文件越多,需要添加次數(shù)就越多。而且,每增加一個(gè)源文件就需要修改CMakeLists.txt文件,“耦合性”太大。這里,可以使用aux_source_directory來(lái)自動(dòng)查找源文件。CMakeLists.txt文件最終如下:

      cmake_minimum_required(VERSION 2.8.5)
      project(cJSON-lib)
      aux_source_directory(. CJSON_SRC)
      add_library(cjson STATIC ${CJSON_SRC})

      (3)遞歸搜索目錄源碼
      若將cJSONdemo改成包含子目錄,子目錄中又包含源碼的形式,有多級(jí)目錄。如下

      cJSONdemo1  
        │── cJSON_Utils.h  
        │── cJSON_Utils.c  
        │── cJSON.h
        │── cJSON.c
        │── CMakeLists.txt 
        └── foo 
            ├── cJSON1.h
            ├── cJSON1.c
            ├── cJSON2.h
            ├── cJSON2.c
            └── goo 
                ├── cJSON3.h
                ├── cJSON3.c
                ├── cJSON4.h
                └── cJSON4.c

      可以使用file命令,來(lái)自動(dòng)遞歸查找相應(yīng)的源文件。CMakeLists.txt文件最終如下:

      cmake_minimum_required(VERSION 2.8.5)
      project(cJSON-lib)
      file(GLOB_RECURSE CJSON_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.c)
      add_library(cjson STATIC ${CJSON_SRC})

      (4)指定構(gòu)建庫(kù)的名字,路徑和前綴。CMakeLists.txt文件最終如下:

      cmake_minimum_required(VERSION 2.8.5)
      project(cJSON-lib)
      file(GLOB_RECURSE CJSON_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.c)
      add_library(cjson STATIC ${CJSON_SRC})
      set_target_properties(cjson PROPERTIES OUTPUT_NAME "json")
      set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/static)
      set(CMAKE_STATIC_LIBRARY_PREFIX "")

      最終效果如圖:

      會(huì)生成cJSONdemo1/static/json.a

      3.2.1 將cJSON外部依賴庫(kù)鏈接進(jìn)可執(zhí)行文件中

      通過(guò)上面過(guò)程了解了將cJSON庫(kù)構(gòu)建文件靜態(tài)庫(kù)的過(guò)程。下面,再添加測(cè)試代碼來(lái)調(diào)用cJSON庫(kù),并最終構(gòu)建為可執(zhí)行文件。目錄如下:

      cJSONdemo2  
        │── test.c
        │── CMakeLists.txt 
        └── lib 
            ├── cJScJSON_UtilsON1.h
            ├── cJSON_Utils.c
            ├── cJSON.h
            ├── cJSON.c
            └── CMakeLists.txt 

      test.c

      #include <stdio.h>
      #include <stdlib.h>
      #include "lib/cJSON.h"
      
      void parser(char* text) {
          char *out;
          cJSON *json;
      
          json = cJSON_Parse(text);
          if (!json) {
              printf("Error before: [%s]\n", cJSON_GetErrorPtr());
          }else {
              out = cJSON_Print(json);
              cJSON_Delete(json);
              printf("%s\n", out);
              free(out);
          }
      }
      
      int main(int argc, char * argv[]) {
          char text[]="[\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"]";
          parser(text);
      
          return 0;
      }

      cJSONdemo2/CMakeLists.txt

      cmake_minimum_required(VERSION 2.8.5)
      
      project(cjson-example)
      
      aux_source_directory(. CJSON_EXAMPLE_SRC)
      
      add_subdirectory(./lib)
      
      add_executable(cjson-example ${CJSON_EXAMPLE_SRC})
      
      target_link_libraries(cjson-example cjson)

      cJSONdemo2/lib/CMakeLists.txt

      cmake_minimum_required(VERSION 2.8.5)
      
      aux_source_directory(. CJSON_SRC)
      
      add_library(cjson STATIC ${CJSON_SRC})

      在終端下執(zhí)行如下操作:

      3.2.2 將cJSON庫(kù)改為可選

      在上面cJSONdemo2的基礎(chǔ)上,新建cJSONConfig.h.in并相應(yīng)修改test.c。目錄如下:

      cJSONdemo3  
        │── test.c
        │── cJSONConfig.h.in
        │── CMakeLists.txt 
        └── lib 
            ├── cJScJSON_UtilsON1.h
            ├── cJSON_Utils.c
            ├── cJSON.h
            ├── cJSON.c
            └── CMakeLists.txt 

      cJSONConfig.h.in

      #cmakedefine USE_CJSON

      test.c

      #include <stdio.h>
      #include <stdlib.h>
      #ifdef USE_MYMATH
      #include "lib/cJSON.h"
      
      void parser(char* text) {
          char *out;
          cJSON *json;
      
          json = cJSON_Parse(text);
          if (!json) {
              printf("Error before: [%s]\n", cJSON_GetErrorPtr());
          }else {
              out = cJSON_Print(json);
              cJSON_Delete(json);
              printf("%s\n", out);
              free(out);
          }
      }
      
      #endif
      
      int main(int argc, char * argv[]) {
          char text[]="[\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"]";
          #ifdef USE_MYMATH
              parser(text);
          #else
              printf("use other json library\n");
          #endif
      
          return 0;
      }

      最終效果如下:

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多