Cmake入門(一)基本編譯命令

2021-09-13 22:47:37 字數 2616 閱讀 5076

首先,對於最簡單的,把乙個cpp檔案編譯成乙個可執行檔案,需要對cmakelists.txt中寫入如下三步內容:

#宣告cmake的最低版本

cmake_minimum_required( version 3.0)

#宣告乙個cmake工程

project( hello )

#新增乙個可執行程式

add_executable( hello hello.cpp)

所以最簡單的就是三步,1.宣告最低版本,2.宣告cmake工程,3.新增可執行程式。

但是如果要使用庫函式,那麼就不是這麼簡單了。

首先我們先簡述一下需要了解庫的檔案結構。

大部分庫都是這樣的結構,標頭檔案和cpp檔案同名,但是不互相用include關聯。乙個放函式的宣告,乙個放函式的具體定義。

舉例來說:

有乙個函式print_hello()的定義放在libhello.cpp中,print_hello()的宣告放在libhello.h中,庫的標頭檔案和庫的cpp檔案沒有互相關聯。

這時候我想寫乙個主函式main.cpp,其中想呼叫print_hello()這個函式,該怎麼辦?

當然,得把庫libhello.h給include進來。

這時候就有乙個問題,主函式main.cpp雖然include了libhello.h,但是這個標頭檔案裡只是宣告了一下void print_hello(),並沒有介紹print_hello()到底是怎麼運作的,具體怎麼運作放在libhello.cpp檔案中。而主函式並沒有#include"libhello.cpp",因此,main.cpp編譯成的可執行檔案是缺東西的,一定不能正常工作(缺print_hello()的內容,目前只有乙個宣告)。

那麼libhello.cpp和main.cpp如何建立聯絡呢?

這個建立聯絡的中介,就是可執行檔案。

對於這個,有兩種方式:

第一種比較簡單和直觀,直接在add_executable的時候,把兩個cpp檔案都add進來。

#宣告cmake的最低版本

cmake_minimum_required( version 3.0)

#宣告乙個cmake工程

project( hello )

#新增乙個可執行程式

add_executable( hello main.cpp libhello.cpp)

第二種,需要把libhello.cpp打包成乙個library,然後把library鏈結到可執行檔案上。

目前的脈絡是這樣:

所以這種情況下,應該這麼寫cmakelists.txt:

cmake_minimum_required( version 3.0)

project( hello_project )

add_executable( hello main.cpp )

add_library( hello_library libhello.cpp)

target_link_libraries( hello hello_library)

因此有如下幾點特點:

1.標頭檔案不在cmakelist**現

2.宣告cmake版本,再宣告工程

3.主函式做成執行檔案

4.cpp檔案做成library

5.library鏈結到執行檔案上

除此之外,還有幾點內容值得學習一下:

第一,標頭檔案最好寫成如下形式:

#ifndef __***_h

#define __***_h

標頭檔案內容

#endif

其中,__***_h也是巨集,它不是頭檔名不過習慣上把這個巨集定義成跟頭檔名相似或一樣。(不一樣也是可以的!)

這個巨集主要是用於編譯的時候避免重複include同一標頭檔案而出現一些額重複定義/宣告的問題。

第二,正常來說,只有在add_library以後生成的hello_library,才能稱它為「庫」。再把庫再鏈結到可執行檔案上。我前面所述「庫的標頭檔案和庫的cpp檔案」主要是為了方便讀者理解。

第三,在add_library的時候,有兩種方式,一種是靜態庫,一種是動態庫。靜態庫以.a為字尾,共享庫以.so為字尾。

二者的差別在於:靜態庫每次呼叫會生成乙個副本,共享庫只有乙個副本。

如果想用共享庫,在add_library的語句中,庫名 和 cpp檔案 之間,加乙個shared即可。

像這樣:

add_library( hello_library shared libhello.cpp)
以上是第二種方式。這一節的內容相當於是做了乙個簡單的例項,讓人明白cmake的基本用法。關於cmake更多的內容,我將它總結在了乙個單獨的分類裡之後將不斷進行更新。

cmake編譯基本知識

一 在終端內編譯 需要首先簡單介紹cmakelists的命令列 例 宣告要求的 cmake 最低版本 cmake minimum required version 2.8 宣告乙個 cmake 工程 project helloslam 設定編譯模式 set cmake build type debu...

cmake的編譯命令提取過程

本來今天應該更新 clang的python bindings 二 的,但是根據實驗室師兄的要求,先更新這一篇。由於專案需要,我們要針對每個開源專案中的源 檔案 cpp,cc,c 進行分析,提取其中的需要的資訊。為了保證資訊提取的準確,我們需要在每個源 檔案分析的時候加上對應的頭檔案目錄 i 以及編譯...

Cmake常用基本命令複習

1.cmake minimum required version 2.8 檢查cmake的版本,至少為2.8 2.project helloworld 工程名為helloworld 通過在主工程檔案cmakelists.txt中修改add subdirectory lib 指令來指定乙個編譯輸出位置...