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 ..
、make
、make 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.專案中用到的已編譯好的靜態庫庫和實時編譯的庫與專案的依賴關係?如果上面這幾件事你知道怎麼做了,多大的工程就都不是問題了。其實主要是...