CMake筆記1 構建基本的專案

2021-09-24 14:31:35 字數 2461 閱讀 8118

project (hello)

set(src_list main.cc)

message(status "this is binary dir " $)

message(status "this is source dir " $)

add_executable(hello $)

幾個說明:

add_execuable:新增原始檔操作,${}是獲取變數的操作,這與shell語法一致。hello是可執行檔案的名稱,可執行檔名稱和工程名稱沒有任何關係。

_binary_dir或者project_binary_dir是指編譯發生的當前目錄;本例子中說的是build目錄

之後,在cmakelists.txt同級資料夾中,建立乙個build資料夾,之後cd build,執行以下兩個命令:

這裡的檔案設計到多個目錄,同時我們還有幫助文件等。在編譯完成後,我們希望把可執行檔案加入到指定的bin目錄中,最後還要把程式安裝在作業系統的/usr/bin目錄中。

首先建立目錄結構:

.

├── build

├── cmakelists.txt

└── src

├── cmakelists.txt

└── main.cpp

cmake_minimum_required(version 3.14)

project(hello)

add_subdirectory(src bin)

main.cpp同級的目錄內容如下:

add_executable(hello main.cpp)
說明add_subdirectory的意義:add_subdirectory(source_dir [binary_dir] [exclude_from_all])。該指令用於向當前工程新增存放原始檔的子目錄,並指定中間二進位制和目標二進位制存放的位置。exclude_from_all的含義是把這個目錄從編譯過程中排除。

注意上述完成編譯後,我們在build目錄下發現了乙個bin目錄,這個目錄內部有乙個hello可執行檔案。如果我們想把可執行檔案放到其他地方,或者把動態鏈結庫或者靜態鏈結庫放到其他地方,需要分別執行以下兩個命令:

一般來說,makefile執行make過後,可以使用make install進行安裝。在cmake中,我們可以自定義安裝目錄,實現可執行檔案或者程式庫的安裝操作,這裡涉及到乙個核心變數cmake_install_prefix和乙個核心指令install

使用set命令可以顯示指定第乙個變數的具體值,之後可以進行install命令的配置,基本的配置方式如圖:

給出乙個簡單的例子:

myrun可執行二進位制檔案安裝到了$/bin目錄中,mylib動態鏈結庫和mystaticlib分別安裝到對應的目錄中。我們不需要關係targets具體生成的路徑,只需要新增上targets名稱即可。

set(cmake_install_prefix /home/erick/desktop/foo)

install(targets hello

runtime destination bin

)

之後進入工程的build目錄,依次執行:cmake ..makemake install。最後會發現桌面的foo目錄下多了乙個bin資料夾,裡面是hello可執行檔案。

有些時候,我們也需要安裝文件到合適的位置,這個指令也包含在install中,舉個例子:

install(directory doc/ destination /share/dock/cmake/pro)
如果不指定特殊的路徑,cmake_install_prefix預設是/usr/local

CMake構建CUDA專案

在大量的c c 的專案中都使用cmake來進行專案的管理,而cuda又是很流行的平行計算庫,利用cmake來構建cuda專案就顯得很有必要了,而且專案中使用的cmakelists.txt基本框架一致的,下面簡單地記載一下這種cmakelists.txt檔案的內容 cmakelists.txt for...

CMake構建OpenCV,GDAL專案

本文舉例的開源庫是opencv和gdal,其他塊源庫類似 使用本篇方法的前提是make install,即開源庫是install的。當然,沒有install的也是可以用的,只需要在findpage前找到dir即可。如找opencv set opencv dir home jie third part...

CMake構建OpenGL專案

我們在用cmake構建乙個工程 專案 的時候,需要明白如下幾件事情 a.專案源 在 b.專案標頭檔案在 c.怎麼生成靜態或者動態庫及庫的位置?d.程式鏈結的靜態庫在 e.專案中用到的已編譯好的靜態庫庫和實時編譯的庫與專案的依賴關係?如果上面這幾件事你知道怎麼做了,多大的工程就都不是問題了。其實主要是...