CMakeLists外部構建 二

2021-10-18 21:52:54 字數 2427 閱讀 9290

cmakelists相關語法說明(一)給出了內部構建的簡單例項。但內部編生成了一些無法自動刪除的中間檔案,所以, 引出了我們對外部編譯的**,外部編譯的過程如下:

1,首先,請清除t1目錄中除main.c cmakelists.txt之外的所有中間檔案,最關鍵 的是 cmakecache.txt。

2,在t1目錄中建立build 目錄,當然你也可以在任何地方建立build目錄,不一定必 須在工程目錄中。

3,進入build目錄,執行cmake ..(注意,..代表父目錄,因為父目錄存在我們需要的 cmakelists.txt,如果你在其他地方建立了build目錄,需要執行cmake 《工程的全 路徑》),檢視一下 build 目錄,就會發現了生成了編譯需要的 makefile 以及其他的中間 檔案.

4,執行 make 構建工程,就會在當前目錄(build 目錄)中獲得目標檔案 hello。

上述過程就是所謂的 out-of-source 外部編譯,乙個最大的好處是,對於原有的工程沒 有任何影響,所有動作全部發生在編譯目錄。通過這一點,也足以說服我們全部採用外部編 譯方式構建工程。

1)構建專案t2,目錄結構如下:

src/cmakelists.txt的內容:

add_executable(hello main.c)
cmakelists.txt的內容:

project (hello)

add_subdirectory(src bin)

2)新建build目錄,並進入build路徑下

#新建build目錄

mkdir build

#進入build目錄

cd build

#執行cmake

cmake ..

#執行make

make

#生辰可執行檔案hello在bin路徑下

add_subdirectory(source_dir [binary_dir] [exclude_from_all])

這個指令用於向當前工程新增存放原始檔的子目錄,並可以指定中間二進位制和目標二進位制存放的位置。exclude_from_all 引數的含義是將這個目錄從編譯過程中排除,比如,工程的 example,可能就需要工程構建完成後,再進入 example 目錄單獨進行構建(當然,你也可以通過定義依賴來解決此類問題)。

上面的例子定義了將 src 子目錄加入工程,並指定編譯輸出(包含編譯中間結果)路徑為 bin 目錄。如果不進行 bin 目錄的指定,那麼編譯結果(包括中間結果)都將存放在 build/src 目錄(這個目錄跟原有的 src 目錄對應),指定 bin 目錄後,相當於在編譯時 將 src 重新命名為 bin,所有的中間結果和目標二進位制都將存放在 bin 目錄。

這裡需要提一下的是 subdirs 指令,使用方法是:

subdirs(dir1 dir2...),但是這個指令已經不推薦使用。它可以一次新增多個子目錄,

並且,即使外部編譯,子目錄體系仍然會被儲存。 如果我們在上面的例子中將add_subdirectory (src bin)修改為subdirs(src)。 那麼在 build 目錄中將出現乙個 src 目錄,生成的目標** hello 將存放在 src 目錄中。

不論是 subdirs 還是 add_subdirectory 指令(不論是否指定編譯輸出目錄),我們都可 以通過 set 指令重新定義 executable_output_path 和 library_output_path 變數 來指定最終的目標二進位制的位置(指最終生成的 hello 或者最終的共享庫,不包含編譯生成 的中間檔案)

set(executable_output_path $/bin)

set(library_output_path $/lib)

在第一節我們提到了_binary_dir 和 project_binary_dir 變數,他 們指的編譯發生的當前目錄,如果是內部編譯,就相當於 project_source_dir 也就是 工程**所在目錄,如果是外部編譯,指的是外部編譯所在目錄,也就是本例中的 build 目錄。

所以,上面兩個指令分別定義了:

可執行二進位制的輸出路徑為 build/bin 和庫的輸出路徑為 build/lib.

本節我們沒有提到共享庫和靜態庫的構建,所以,你可以不考慮第二條指令。
問題是,我應該把這兩條指令寫在工程的 cmakelists.txt 還是 src 目錄下的 cmakelists.txt,把握乙個簡單的原則,在** add_executable 或 add_library, 如果需要改變目標存放路徑,就在**加入上述的定義。

在這個例子裡,當然就是指 src 下的 cmakelists.txt 了。

如何構建健康的外部鏈結

如何構建健康的外部鏈結,無論seo行業如何變更,暫時都離不開外部鏈結這個因素,而很多新手站長則認為構建外部鏈結其實是一件非常簡單的事情,只要每天堅持的頂頂論壇帖子,每天到處留下鏈結,以為這樣就是所謂的構建外部鏈結了,其實構建外部鏈結並不是想象中那麼簡單。第一 外鏈的數量 很多時候新手站長在看到有些 ...

排序(二 外部排序

一 定義 外部排序指的是大檔案的排序,即待排序的記錄儲存在外儲存器上,待排序的檔案無法一次裝入記憶體,需要在記憶體和外部儲存器之間進行多次資料交換,以達到排序整個檔案的目的。二 處理過程 1 按可用記憶體的大小,把外存上含有n個記錄的檔案分成若干個長度為l的子檔案,把這些子檔案依次讀入記憶體,並利用...

構建之法(二)

看了一部分後感覺自己有了一部分提公升,也有了不少的收穫,也算是對自己的軟體有所了解 程式 演算法 資料結構 軟體 程式 軟體工程 軟體企業 軟體 商業模式 學習軟體工程這門課程已經有16周了,通過這十六周的學習 實驗 以及閱讀我對軟體工程這門課程有了一定的了解。下面就通過對 構建之法 這本書的閱讀過...