91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 0.26M
    文件類型: .pdf
    金幣: 1
    下載: 0 次
    發布日期: 2021-03-27
  • 語言: 其他
  • 標簽: 其他??

資源簡介


簡單到復雜的cmake編寫教程,適合剛入們的新手。cmake 已經開發了 5,6 年的時間,如果沒有 KDE4,也許不會有人或者 Linux 發行版 本重視 cmake,因為除了 Kitware 似乎沒有人使用它。通過 KDE4
初識 cmake Cmake不再使你在構建項目時郁悶地想自殺了 一位KDE開發者 1,背景知識: cmake是 kitware公司以及一些開源開發者在開發幾個工具套件(VTK)的過程中衍 生品,最終形成體系,成為一個獨立的開放源代碼項目。項目的誕生時間是2601年。其官 方網站是ww. cmake.org,可以通過訪問官方網站獲得更多關于 cmake的信息。 cmake 的流行其實要歸功于KDE4的開發(似乎跟當年的Svn一樣,KDE將代碼倉庫從CVS遷移到 SVN,同時證明了SWN管理大型項目的可用性),在KDE開發者使用了近10年 autotools 之后,他們終于決定為KDE4選擇一個新的工程構建工具,其根本原因用KDE開發者的話來 說就是:只有少數幾個“編譯專家”能夠掌握KDE現在的構建體系 ( admin/ Makefile. common),在經歷了 unsermake, scons以及 cmake的選型和嘗 試之后,KDE4決定使用 cmake作為自己的構建系統。在遷移過程中,進展異常的順利,并 獲得了 cmake開發者的支持。所以,目前的KDE4開發版本已經完全使用 cmake來進行構 建。像 kdesvn, rosegarden等項目也開始使用 cmake,這也注定了 cmake必然會成為 個主流的構建體系。 2,特點: cmake的特點主要有: ,開放源代碼,使用類BSD許可發布http://cmake.org/html/copyrigHt.html 2,跨平臺,并可生成 native編譯配置文件,在 Linux/Uni×平臺,生成 makefile,在 蘋果平臺,可以生成 xcode,在 Window5平臺,可以生成MsVC的工程文件。 3,能夠管理大型項目,KDE4就是最好的證明。 4,簡化編譯構建過程和編譯過程。 Cmake的工具鏈非常簡單: cmake+make。 5,高效慮,按照KDE官方說法, CMake構建KDE4的 kdelib5要比使用 autotools來 構建KDE3.5.6的 delis快40%,主要是因為 Cmake在工具鏈中沒有 libtool。 6,可擴展,可以為 cmake編寫特定功能的模塊,擴充 cmake功能。 3,問題,難道就沒有問題? 1, cmake很簡單,但絕對沒有聽起來或者想象中那么簡單。 2, cmake編寫的過程實際上是編程的過程,跟以前使用 autotools一樣,不過你需要編 寫的是 CMakelists5.txt(每個目錄一個),使用的是" cmake語言和語法。 3, cmake跟已有體系的配合并不是特別理想,比如 pkgconfig,您在實際使用中會有所 體會,雖然有一些擴展可以使用,但并不理想。 4,個人的建議: 如果你沒有實際的項目需求,那么看到這里就可以停下來了,因為 cmake的學習過程就 是實踐過程,沒有實踐,讀的再多幾天后也會忘記 2,如果你的工程只有幾個文件,直接編寫 Makefile是最好的選擇。 3,如果使用的是C/C++/Java之外的語言,請不要使用 cmake(至少目前是這樣) 4,如果你使用的語言有非常完備的構建體系,比如java的ant,也不需要學習 cmake, 雖然有成功的例子,比如QT4.3的 csharp綁定 yoto。 5,如果項目已經采用了非常完備的工程管理工具,并且不存在維護問題,沒有必要遷移到 cmake 4,如果僅僅使用qt編程,沒有必要使用 cmake,因為 qmake管理Qt工程的專業性和自 動化程度比 cmake要高很多。 二,安裝 cmake 還需要安裝嗎? cmake目前已經成為各大 Linux發行版提供的組件,比如 Everest直接在系統中包含 Fedora在 extra倉庫中提供,所以,需要自己動手安裝的可能性很小。如果你使用的操 作系統(比如 Windows或者某些 Linux版本)沒有提供 cmake或者包含的版本較舊,建議 你直接從 cmake官方網站下載安裝。 http://www.cmake.org/html/downloAd.html 在這個頁面,提供了源代碼的下載以及針對各種不同操作系統的二進制下載,可以選擇適合 自己操作系統的版本下載安裝。因為各個系統的安裝方式和包管理格式有所不同,在此就不 再贅述了,相信一定能夠順利安裝 cmake。 ,初試 cmake- cmake的 helloworld Hello world,世界你好 本節選擇了一個最簡單的例子 Helloworld來演練一下 cmake的完整構建過程,本節并不 會深入的探討 cmake,僅僅展示一個簡單的例子,并加以粗略的解釋。我們選擇了 Everest linux作為基本開發平臺,因為這個只有一張CD的發行版本,包含了gcc 4.2/gtk/qt3/qt4等完整的開發環境,同時,系統默認集成了 cmake最新版本2.4.6。 ,準備工作: 首先,在/ backup目錄建立一個 cmake目錄,用來放置我們學習過程中的所有練習。 mkdir -p/backup/cmake 以后我們所有的 cmake練習都會放在/ backup/ cma ke的子目錄下(你也可以自行安排目錄, 這個并不是限制,僅僅是為了敘述的方便) 然后在 cmake建立第一個練習目錄t1 cd /backup/cmake mkdir tl d t1 在t1目錄建立main.C和 CMakelists.txt(注意文件名大小寫): main.C文件內容: //main. c #include <stdio. h> int main () printf ("hello world from tl Main! \n") return o Cmakelists.txt文件內容: PROJECT (HELLO) SET(SRC LIST main. c) MESSAGE(STATUS This is binarY dir $HELLO BINARY DIRj MESSAGE(STATUS This is source dir SHELLO SOURCE DIRF) ADd EXECUTABLE(helLo SRC LIST) 2,開始構建 所有的文件創建完成后,t1目錄中應該存在main.C和 CMakelists.txt兩個文件 接下來我們來構建這個工程,在這個目錄運行: cmake.(注意命令后面的點號,代表本目錄)。 輸出大概是這個樣子: Check for working c compiler: /usr/bin/gcc Check for working c compiler: /usr/bin/gcc -. works Check size of void Check size of void- done Check for working CXX compiler: /usr/bin/c++ Check for working CXX compiler: /usr/bin/c++-- works This is binary dir /backup/cmake/t1 This is source dir /backup/ cmake/t1 Configuring done Generating done Build files have been written to: /backup/cmake/t1 再讓我們看一下目錄中的內容: 你會發現,系統自動生成了: CMakefiles, CMakeCache.txt, cmake install. cmake等文件,并且生成了 Makefile 現在不需要理會這些文件的作用,以后你也可以不去理會。最關鍵的是,它自動生成了 Makefile 然后進行工程的實際構建,在這個目錄輸入make命令,大概會得到如下的彩色輸出: Scanning dependencies of target hello [100] Building c object CMakeFiles/hello. dir/main.o Linking c executable hello [100% Built target hello 如果你需要看到make構建的詳細過程,可以使用 make verbi0SE=1或者 VERBOSE=1 make命令來進行構建。 這時候,我們需要的目標文件 hello已經構建完成,位于當前目錄,嘗試運行一下: Thello 得到輸出: Hello world from Main 恭喜您,到這里為止您已經完全掌握了 cmake的使用方法。 3,簡單的解釋 我們來重新看一下 CMakelists.txt,這個文件是 cmake的構建定義文件,文件名 是大小寫相關的,如果工程存在多個目錄,需要確保每個要管理的目錄都存在一個 CMakelists.txt。(關于多目錄構建,后面我們會提到,這里不作過多解釋)。 上面例子中的 CMakelists.txt文件內容如下: PROJECT (HELLO) SET(SRC LIST main. c) MESSAGE (STATUS This is binary dir $HELLO BINARY DIRl) MESSAGE(STATUS This is source dir $HELLO SOURCE DIR]) ADD EXECUTABLE(hello ISRC LISTI) PR0JECT指令的語法是: PROJECT(projectname [CXX] [c] [Javal) 你可以用這個指令定義工程名稱,并可指定工程支持的語言,支持的語言列表是可以忽略的, 默認情況表示支持所有語言。這個指令隱式的定義了兩個 cmake變量: < projectname> BINARY DIR以及< projectname>S0URCE_DIR,這里就是 HELL0 BINARY DIR和HELL0S0 URCE DIR(所以 CMakelists.txt中兩個 MESSAGE 指令可以直接使用了這兩個變量),因為采用的是內部編譯,兩個變量目前指的都是工程所 在路徑/ backup/ cmake/t1,后面我們會講到外部編譯,兩者所指代的內容會有所不同 同時 cmake系統也幫助我們預定義了PRO] ECT BINARY DIR和 PROJECT SOURCE DIR 變量,他們的值分別跟HELL0 BINARY DIR與HELL0 SOURCE DIR一致。 為了統一起見,建議以后直接使用PR0 JECT BINARY DIR,PR0 JECT S0 URCE DIR,即 使修改了工程名稱,也不會影響這兩個變量。如果使用了 < projectname>s0URCE_D工R,修改工程名稱后,需要同時修改這些變量。 SET指令的語法是: SET(VAR [VALUE [CACHE TYPE DOCSTRING [FORCE]l) 現階段,你只需要了解SET指令可以用來顯式的定義變量即可。 比如我們用到的是SET( SRC LIST main.C),如果有多個源文件,也可以定義成 SET(SRC LIST main. c tlc t2.c)o MESSAGE指令的語法是: MESSAGE([SEND ERROR STATUS FATAL ERROR] message to display 這個指令用于向終端輸出用戶定義的信息,包含了三種類型: SEND ERROR,產生錯誤,生成過程被跳過。 SATUS,輸出前綴為-的信息。 FATAL ERR0R,立即終止所有 cmake過程 我們在這里使用的是 STATUS信息輸出,演示了由PR0]ECT指令定義的兩個隱式變量 HELL0 BINARY DIR和HELL0S0 URCE DIR。 ADd EXECUTABLE(helLo $ISRC listy) 定義了這個工程會生成一個文件名為 hello的可執行文件,相關的源文件是 SRC LIST中 定義的源文件列表,本例中你也可以直接寫成 ADD EXECUTABLE( hello main,C 在本例我們使用了${}來引用變量,這是 cmake的變量應用方式,但是,有一些例外,比 如在工F控制語句,變量是直接使用變量名引用,而不需要${}。如果使用了$}去應用變 量,其實IF會去判斷名為${}所代表的值的變量,那當然是不存在的了。 將本例改寫成一個最簡化的 CMakelists.txt PROJECT(HELLO) ADd EXECUTABLE(hello main. c) 4,基本語法規則 前面提到過, cmake其實仍然要使用" cmake語言和語法"去構建,上面的內容就是所謂的 " cmake語言和語法〃,最簡單的語法規則是 1,變量使用$仍}方式取值,但是在IF控制語句中是直接使用變量名 2,指令(參數1參數2...) 參數使用括弧括起,參數之間使用空格或分號分開 以上面的 ADD EXECUTABLE指令為例,如果存在另外一個func.C源文件,就要寫成 ADD EXECUTABLE( hello main. c func,c)或者 ADD EXECUTABLE(hello main. c; func. c) 3,指令是大小寫無關的,參數和變量是大小寫相關的。但,推薦你全部使用大寫指令 上面的 MESSAGE指令我們已經用到了這條規則 MESSAGE(STATUS This is binary dir/ $HELLo BINARY DIR]) 也可以寫成: MESSAGE(STATUS "This is binary dir $HELLO BINARY DIR") 這里需要特別解釋的是作為工程名的HELL0和生成的可執行文件 hello是沒有任何關系的。 heLo定義了可執行文件的文件名,你完全可以寫成: ADD EXECUTABLE(tl main. c) 編譯后會生成一個t1可執行文件。 5,關于語法的疑惑 cmake的語法還是比較靈活而且考慮到各種情況,比如 SET( SRC LIST main.C)也可以寫成SET( SRC LIST“main.C") 是沒有區別的,但是假設一個源文件的文件名是func.C(文件名中間包含了空格)。 這時候就必須使用雙引號,如果寫成了SET( SRC List fu nd.c),就會出現錯誤,提示 你找不到fu文件和nc.C文件。這種情況,就必須寫成 SET( SRC LIST“func.C 此外,你可以可以忽略掉 source列表中的源文件后綴,比如可以寫成 ADD EXECUTABLE(t1main), cmake會自動的在本目錄查找main.C或者main.Cpp 等,當然,最好不要偷這個懶,以免這個目錄確實存在一個main.C一個main 同時參數也可以使用分號來進行分割。 下面的例子也是合法的: ADD EXECUTABLE(t1main.Ct1.c)可以寫成 ADD EXECUTABLE(t1 main. c; tl.c) 我們只需要在編寫 CMakelists.txt時注意形成統一的風格即可 6,清理工程: 跟經典的 autotools系列工具一樣,運行: make clean 即可對構建結果進行清理。 7,問題?問題 我嘗試運行了 make distclean,這個指令一般用來清理構建過程中產生的中間文件的 如果要發布代碼,必然要清理掉所有的中間文件,但是為什么在 cmake工程中這個命令是 無效的? 是的, cmake并不支持 make distclean,關于這一點,官方是有明確解釋的: 因為 CMakelists.txt可以執行腳本并通過腳本生成一些臨時文件,但是卻沒有辦法來跟 蹤這些臨時文件到底是哪些。因此,沒有辦法提供一個可靠的 make distclean方案。 Some build trees created with gnu autotools have a make distclean" target that cleans the build and also removes Makefiles and other parts of the generated build system make does not generate a"make distclean"target because CMakeLists. txt files can run scripts and arbitrary commands CMake has no way of tracking exactly which files are generated as part of running

資源截圖

代碼片段和文件信息

評論

共有 條評論