成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

拋棄 Autotools 向 CMake 邁進吧

開發 開發工具 Linux
CMake 是一個跨平臺的編譯、測試和打包軟件,即使你以前從來沒有使用過構建系統,也可以輕松上手。

[[401319]]

CMake 是一個跨平臺的編譯、測試和打包軟件,即使你以前從來沒有使用過構建系統,也可以輕松上手。

在我以前的文章 Autotools 入門 一文中,我說明了如何使用 Autotools 來管理和打包代碼。這是一個強大且通用的平臺,可輕松集成到許多打包系統中,包括 RPM、APT、pkgsrc 等等。它的語法和結構可能會令人困惑,但幸運的是,我們還有其他選擇,開源的 CMake 就是其中一個。

CMake 是一個用于構建、測試和打包軟件的跨平臺套件。它使用簡單而清晰的語法,因此即使你以前從未使用過構建系統,也很容易開始使用。

安裝 CMake

CMake 可能已經安裝在你的 Linux 系統上。如果沒有,你可以使用發行版的程序包管理器進行安裝:

  1. $ sudo dnf install cmake

在 Debian 或者其他相似的系統上:

  1. $ sudo apt install cmake

在 Mac 上,你可以使用 MacPorts 或者 Homebrew 來安裝:

  1. $ sudo port install cmake

在 Windows 上,你可以使用 Chocolatey 或者直接從 CMake 網站 下載二進制來安裝。

使用 CMake

對于想要從源代碼構建軟件的開發人員或用戶來說,CMake 是一種快速簡便的編譯和安裝方法。 CMake 分階段工作:

  1. 首先,在 cmake 步驟中,CMake 掃描計算機查看一些默認設置。默認設置包括庫的位置以及在系統上安裝軟件的位置。
  2. 接下來,使用系統上的 make 命令(在 Linux 上是 GUN Make,在 NetBSD 上是 NetBSD Make)來編譯程序。這個過程通常是將人類可讀的源代碼轉換成機器語言。
  3. 最后,在 make install 一步中,那些編譯過的文件將被拷貝到(在 cmake 步驟中掃描出來的)計算機上合適的位置。

這看起來很簡單,當你使用 CMake 時就是這樣。

CMake 的可移植性

CMake 在設計時就考慮了可移植性。雖然它不能使你的項目在所有 POSIX 平臺上都能正常工作(這取決于作為開發者的你),但它可以確保將標記為要安裝的文件安裝到已知平臺上最合適的位置。而且由于有了 CMake 之類的工具,對于高級用戶而言,根據其系統需求自定義和覆蓋任何不合適的選項都很容易。

使用 CMake,你只需要知道將哪些文件安裝到哪個常規位置即可。它會照顧其他一切。不再需要自定義安裝腳本,它們有可能在任何未經測試的操作系統上失敗。

打包

像 Autotools 一樣,CMake 也得到了很好的打包支持。無論它們是打包成 RPM 還是 DEB 或 TGZ(或其他任何東西),將帶有 CMake 的項目交給打包者,他們的工作既簡單又直接。打包工具支持 CMake,因此可能不需要進行任何修補或者調整。在許多情況下,可以自動將 CMake 項目整合到工作流中。

如何使用 CMake

要在項目中使用 CMake,只需在項目目錄中創建 CMakeLists.txt 文件。首先,聲明最低要求的 CMake 版本以及項目名稱和版本。CMake 會努力在盡可能長時間內保持兼容性,但是隨著你使用的時間越長,并且關注它最新的開發動態,你就會知道哪些特性是你所依賴的。

  1. cmake_minimum_required(VERSION 3.10)
  2.  
  3. project(Hello VERSION 1.0)

如你可能已經看到的那樣,CMake 的語法是一個帶有括號和參數的命令。大寫的 VERSION 字符串不是任意的,也不只是格式。它們是 project 命令中的有效參數。

在繼續之前,先寫一個簡單的 C 或者 C++ 的 hello world 程序。為了簡單,我就寫了六行 C 代碼,并把它保存在 hello.c 中(為了匹配我在 CMakeLists.txt 中可執行文件的名字)。

  1. #include <stdio.h>
  2.  
  3. int main() {
  4.    printf("Hello open source\n");
  5.    return 0;
  6. }

不過,不要搞錯了,CMake 不僅適用于 C 和 C++。它可以處理任意文件,并且有許多可用的命令,因此它可以幫助你維護許多不同形式的項目。

CMake 網站中記錄了所有有效的內置命令及其可用參數,因此無論你要做什么,都可以輕松發現所需的功能。不過,這是一個簡單的示例,因此,你需要的下一個命令是必不可少的 —— 你必須為 CMake 定義要構建的代碼:

  1. add_executable(Hello hello.c)

這個命令指定了你編譯后的二進制文件的名字為 Hello。因此,它與你在終端中執行帶有 -o Hello 的 gcc 命令是一樣的。

在一些比較復雜的項目中,你可能還需要使用庫文件,你可以使用 add library 命令來鏈接庫文件。

在你設置了你想要構建和標記為安裝的文件之后,你必須要告訴 CMake 一旦用戶安裝了程序,最終的應用程序應該在哪個位置。

在這個簡單的例子里,你僅需要做的一件事就是在你的 CMakeLists.txt 文件里添加 install 命令。install 命令接受幾個參數。但是在這個例子中,你僅需要使用 TARGET 命令來指定你要安裝文件的名字。

  1. install(TARGETS Hello)

向 CMake 工程添加一些文件

一個軟件項目向用戶交付的往往不僅僅只有代碼,還有一些其他的文件數據,例如手冊或者是信息頁、示例項目,或者是配置文件。你可以使用與包含編譯文件時類似的工作流程,將任意數據包含在 CMake 項目中:在 CMakelists.txt 文件中使用 file 命令,然后說明一下這些文件要安裝在哪里。

例如,你可以在這個項目中包含一個 assets 目錄,你可以使用 file 命令,后面跟上 COPY 和 DESTINATION 參數來告訴 CMake 將這些額外的文件復制到你的分發包中。

  1. file(COPY assets DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")

這個 ${CMAKE_CURRENT_BINARY_DIR} 變量是一個特殊的 CMake 內置變量,表示 CMake 正在處理的目錄。換句話說,你的任何文件都會被復制到編譯目錄(在你運行 cmake 命令后,這個過程會更加清晰,到時候回過頭來看一下)。

因為這些額外的數據文件有些雜亂不堪(如果你不信的話,可以看一下 /usr/share 這個目錄)。對于你自己的項目創建一個子文件夾對誰都有好處。最好也帶上版本名字。你可以通過在 CMAKE_CURRENT_BINARY_DIR 中指定一個新的目錄,使用你選擇的項目名稱,后面跟一個為你的項目命名的特殊變量和你在項目聲明中為它設置的 VERSION

  1. file(COPY assets DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/Hello-${Hello_VERSION}")

定義安裝位置

你已經定義你要編譯的文件,因此現在你要告訴 CMake 你的程序要安裝在哪個位置。比如你的主程序,這個要程使用 install 命令:

  1. install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/Hello-${Hello_VERSION}" TYPE DATA)

這里有一些新的參數。DIRECTORY 參數指定了數據文件是一個目錄,而不是一個文件(FILE)或者腳本(SCRIPT)。你使用的參數和復制一些額外文件到編譯目錄時是一樣。另外,在 install 命令中 TYPE 或者 DESTINATION 必須要指定其一。TYPE 參數指定了通用的文件類型,這些文件通常將會被放到合適的位置。在 Linux 系統上,TYPE DATA 一般是 /usr/local/share 或者 /usr/share,除非用戶定義了其他的位置。

這是諸如 CMake 之類的良好構建系統的強大功能之一。你不必擔心文件的確切位置,因為你知道用戶可以更改 CMake 的首選默認設置,并且 CMake 將構建代碼以使其正常工作。

運行 CMake

CMake 有多種方式來讓你執行命令,你可以在終端或者在一個可交互的程序上執行命令,或者你也可以使用它的圖形界面(GUI)。我比較偏向于使用終端命令,但是我也喜歡使用一些其他的方式(相比與在 Makefile 中查找那些晦澀的變量然后去修改它們更勝一籌)。

對于編譯過開源 C++ 項目的任何人,都熟悉的第一步是創建一個 build 目錄,進入到該目錄,然后運行 cmake .. 命令。 我是一個懶惰的打字員,所以我將構建目錄命名為 b,但是你可以使用最合適的方式:

  1. $ mkdir b
  2. $ cd b
  3. $ cmake ..
  4. -- The C compiler identification is GNU 11.1.1
  5. -- The CXX compiler identification is GNU 11.1.1
  6. -- Detecting C compiler ABI info
  7. -- Detecting C compiler ABI info - done
  8. -- Check for working C compiler: /usr/bin/cc - skipped
  9. -- Detecting C compile features
  10. -- Detecting C compile features - done
  11. -- Detecting CXX compiler ABI info
  12. -- Detecting CXX compiler ABI info - done
  13. -- Check for working CXX compiler: /usr/bin/c++ - skipped
  14. -- Detecting CXX compile features
  15. -- Detecting CXX compile features - done
  16. -- Configuring done
  17. -- Generating done
  18. -- Build files have been written to: /var/home/seth/demo-hello/b
  19. $

這或多或少相當于經典的 ./configure; make; make install 中的 ./configure。看一下你的構建目錄,CMake 已經幫你生成了幾個新的文件,來讓你的項目更完整。這里生成了 CMake 的數據文件、一個常規的 Makefile 文件(這是一個免費提供的 247 行的文件,但對于越復雜的項目,行數要多得多),還有一個包含這個示例程序的任意非編譯數據的 Hello-1.0 目錄。

  1. $ ls
  2. CMakeCache.txt
  3. CMakeFiles
  4. Makefile
  5. Hello-1.0
  6. cmake_install.cmake

接下來,你可以進行構建。你可以使用 CMake 的 --build 選項來做這件事,使用當前的構建目錄作為源目錄。

  1. $ cmake --build .
  2. Scanning dependencies of target Hello
  3. [ 50%] Building C object CMakeFiles/Hello.dir/hello.c.o
  4. [100%] Linking C executable Hello
  5. [100%] Built target Hello

或者你可以運行 make 命令。這將讀取由 CMake 生成的 Makefile 文件。在這個例子中,make 默認的行為就是由源程序 hello.c 生成目標文件。

  1. $ make
  2. Scanning dependencies of target Hello
  3. [ 50%] Building C object CMakeFiles/Hello.dir/hello.c.o
  4. [100%] Linking C executable Hello
  5. [100%] Built target Hello
  6. $

如你所料,Hello 二進制可執行文件現在存在于當前的構建目錄中。因為它是一個簡單的自包含應用程序,所以你可以運行它進行測試:

  1. $ ./Hello
  2. Hello open source
  3. $

最后,你可以用 --install 選項進行安裝。因為我不希望我的簡單的 “hello world” 應用程序真的被安裝到我的系統上,我設置了 --prefix 選項,將 CMake 的目標從根目錄(/)重定向到 /tmp 的一個子目錄。

  1. $ cmake --install . --prefix /tmp/hello/
  2. -- Install configuration: ""
  3. -- Installing: /tmp/dist-hello/usr/local/bin/Hello
  4. -- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0
  5. -- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file0
  6. -- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file1

另外,你也可以運行 make install 來調用 Makefile 的安裝動作。同樣,為了避免在我的系統上安裝一個演示程序,我在這個例子中設置了 DESTDIR 變量,將安裝目標重定向到 /tmp 的一個子目錄:

  1. $ mkdir /tmp/dist-hello
  2. $ make install DESTDIR=/tmp/dist-hello
  3. [100%] Built target Hello
  4. Install the project...
  5. -- Install configuration: ""
  6. -- Installing: /tmp/dist-hello/usr/local/bin/Hello
  7. -- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0
  8. -- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file0
  9. -- Installing: /tmp/dist-hello/usr/local/share/Hello-1.0/assets/file1

看一下輸出的內容,來確定它具體的安裝位置,這個程序已經安裝好了。

快速自定義

CMake 的安裝前綴(由 CMAKE_INSTALL_PREFIX 變量指定)默認是在 /usr/local 這個位置,但是所有的 CMake 變量都可以在你運行 cmake 命令的時候,加一個 -D 選項來改變它。

  1. $ cmake -DCMAKE_INSTALL_PREFIX=/usr ..
  2. $ make install DESTDIR=/tmp/dist-hello
  3. $ make install DESTDIR=/tmp/dist-hello
  4. [100%] Built target Hello
  5. Install the project...
  6. -- Install configuration: ""
  7. -- Installing: /tmp/dist-hello/usr/bin/Hello
  8. -- Installing: /tmp/dist-hello/usr/share/Hello-1.0
  9. -- Installing: /tmp/dist-hello/usr/share/Hello-1.0/assets/file0
  10. -- Installing: /tmp/dist-hello/usr/share/Hello-1.0/assets/file1

所有由 CMake 使用的變量都可以通過這種方式來修改。

交互式的 CMake

CMake 的交互模式是一種用于配置安裝環境的友好而有用的方法。要讓用戶知道該項目使用的所有可能的 CMake 變量是一件工作量很大的事,因此 CMake 交互式界面是他們無需查看 Makefile 和 CMakeLists 即可發現自定義選項的簡便方法。

為了調用這個交互式的 CMake,使用 ccmake 命令,在這個簡單的項目里沒有太多的東西。但是對于像 Rosegarden 這樣的大型項目,這將非常有用。

 

Rosegarden

CMake 的更多知識

還有很多很多的 CMake 知識需要去了解。作為一個開發者,我非常喜歡它簡潔的語法、詳盡的文檔、可擴展性以及便捷性。作為一個用戶我非常喜歡 CMake 友好且實用的錯誤提示信息還有它的用戶界面,如果你的項目還未開始使用構建系統,請了解一下 CMake 吧。你以及以后嘗試打包你應用程序的任何人都不會后悔。 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2010-04-16 15:19:18

新一代數據中心

2025-01-10 13:36:24

2013-05-13 13:27:50

服務器接入萬兆10GBase-T

2012-02-08 16:31:09

IBM玉柴重工Power7服務器

2015-07-17 11:08:13

GoogleOpenStack

2022-11-03 14:56:12

物聯網清潔能源

2020-10-24 14:01:50

機器人人工智能學習

2009-10-20 14:59:48

智能建筑綜合布線系統

2011-03-24 10:33:28

私有云

2019-08-14 10:20:57

GNU Autotoo

2018-07-04 10:45:29

數字化

2017-08-07 09:32:09

5G網絡虛擬化切片

2015-06-01 10:05:41

數據中心萬兆以太網

2021-05-17 15:08:24

局域通信技術廣域通信技術智能時代

2016-07-07 10:53:12

H3C

2013-01-29 10:22:41

IBM大型主機四川農信

2022-12-14 09:51:04

Twitter開源

2022-12-01 10:07:16

數據

2021-11-05 10:13:39

新華三
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91超碰在线 | 久久精品免费一区二区三 | 免费电影av | 欧美日韩视频 | 免费在线观看av的网站 | 日韩成人高清在线 | 午夜小视频在线播放 | 一区二区三区四区在线视频 | 久久99久久久久 | 9191在线播放| 免费黄色录像视频 | 日本一级淫片免费啪啪3 | 精品国产女人 | 国产精品日韩一区 | 久久精品一区二区视频 | 亚洲欧美日韩电影 | 国产最新网址 | 影视一区| 精品久久久久久红码专区 | 在线观看国产网站 | 黄色福利| 91欧美激情一区二区三区成人 | 色就干| 午夜精品一区二区三区在线视频 | 欧美精品在线视频 | 自拍偷拍精品 | 久色 | 国产综合久久久久久鬼色 | 成人免费毛片片v | 91精品国产91久久综合桃花 | 国内精品久久久久久久影视简单 | 99福利视频导航 | 久久99精品久久久久久国产越南 | 亚洲最大成人综合 | 国产国拍亚洲精品av | 夜夜爽99久久国产综合精品女不卡 | 成年人在线观看视频 | 日韩成人免费视频 | 91视频91| 91精品久久久久久久久 | 99热视 |