首先,對於最簡單的,把乙個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 指令來指定乙個編譯輸出位置...