cmake是一個跨平台的c/c++工程管理工具,可以通過cmake輕松管理我們的項目
conan是一個包管理工具,能夠自動幫助我們下載及管理依賴,可以配合cmake使用
這是一個入門教程,想深入了解的我在后面放了幾個鏈接可以去學習
1 cmake
1.1 下載cmake
1.2 cmake的主要命令
cmake -B [target]
[target] 表示我們希望cmake生成文件存放的目錄,一般命名為build, 我們也可以進入到build文件夾下使用cmake ..
將cmake生成的文件存放到當前目錄
這個命令作用是自動幫我們生成makefile文件
注意事項:build 文件的上一級目錄中要有CMakeLists.txt文件,即cmake的描述文件
cmake --build [target]
開始編譯,[target]是上一步存放cmake生成文件的目錄,如果我們在該目錄中 使用cmake --build .
即可
1.3 cmake描述文件CMakeLists.txt初體驗
(1)聲明需要的cmake的最低版本: 這行必須在描述文件的第一行,這里我設置的最低版本是3.16
cmake_minimum_required(VERSION 3.16)
(2) 添加項目名: 這里我把項目名稱設置為cmake
project(cmake)
(3) 添加可執行文件名:這里我設置的可執行文件名是cmake,他依賴的文件是main.cpp,在編譯完成后回生成cmake.out或cmake.exe文件
add_executable(cmake main.cpp)
以上三行代碼就簡單定義好一個cmake描述文件了,這三行也是一個camke描述文件必不可少的
1.4 cmake描述文件再探
上一節介紹了cmake的簡單使用,我們的工程不會只有一個文件,也不會只有一個文件夾,否則也不會使用cmake來幫助我們管理,接下來介紹cmake的更多用法
(1) 設置c++版本:指定c++最低編譯版本,這里我設置的是14
set(CMAKE_CXX_STANDARD 14)
(2) 指定工程的版本號及語言:使用1.3節第(2)步的命令我們可以為工程設置版本號和指定語言,這里設置的版本號是1.0.0,語言CXX表示c++, 我們可以設置4個字段的版本信息,通過使用配置文件生成頭文件在我們的項目中使用版本信息, 4個字段見附錄
project(cmake VERSION 1.0.0 LANGUAGES CXX)
(3) 生成靜態鏈接庫: 有時候我們的文件可能分散在多個文件夾中,這時我們就可以通過生成靜態庫的方式將他們鏈接並生成可執行文件,我們需要在子文件中同樣包含CMakeLists.txt文件,然后添加
add_library(libmyHeap STATIC ${CMAKE_CURRENT_SOURCE_DIR}/MyHeap.cpp) # 當前庫文件
target_include_directories(libmyHeap PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) # 頭文件
這里通過add_library()
指定生成庫,libmyHeap
是庫的名字,STATIC
指定生成的靜態庫,${CMAKE_CURRENT_SOURCE_DIR}/MyHeap.cpp
指定我們生成庫依賴源文件的路徑
${CMAKE_CURRENT_SOURCE_DIR}
表示當前CMakeLists.txt所在的文件路徑
target_include_directories()
指定生成庫依賴的頭文件
libmyHeap
是生成靜態庫的名字
PUBLIC
表示當前靜態庫的依賴可以被上層cmake發現,同時該庫也依賴該頭文件,當然還有其它設置,作為入門不做介紹
${CMAKE_CURRENT_SOURCE_DIR}
表示當前CMakeLists.txt所在的文件路徑
通過這兩句命令即可生成一個靜態庫,要想能被可執行程序鏈接到,我們只需在頂層CMakeLists.txt文件中添加
add_subdirectory(myHeap) # 添加子目錄搜索路徑
以及
target_link_libraries(cmake libmyHeap)
首先,第一句add_subdirectory()
指定底層CMakeLists.txt的路徑,這樣我們的頂層CMakeLists.txt就能找到並編譯
target_link_libraries()
第一個參數指定target即我們的項目名,第二個參數指定要鏈接的庫名
由於我們在上面設置生成靜態庫時設置可見屬性為PUNLIC 因此這里不需要指定頭文件路徑,cmake就可以通過底層CMakeLists.txt 找到我們需要的頭文件,這也是現代cmake的做法
以上就是cmake的基本使用,我們可以把文件放在不同文件夾,並通過生成靜態庫的方式將各個文件鏈接起來,這里列出總的CMakeLists.txt文件
頂層CMakeLists.txt
cmake_minimum_required(VERSION 3.16) # 設置cmake最低版本
project(cmake VERSION 1.0.0 LANGUAGES CXX) # 設置文件名及版本信息
set(CMAKE_CXX_STANDARD 14) # 設置c++版本
add_subdirectory(myHeap) # 添加子目錄搜索路徑,這里值myHeap路徑
add_executable(cmake main.cpp) # 添加可執行文件
target_link_libraries(cmake libmyHeap) # 鏈接庫名稱
底層CMakeLists.txt
add_library(libmyHeap STATIC ${CMAKE_CURRENT_SOURCE_DIR}/MyHeap.cpp) # 當前庫文件
target_include_directories(libmyHeap PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) # 頭文件
文件結構
Ok,上面就列出了cmake的簡單使用,有時候我們寫項目的時候需要使用別人寫的庫,這個時候一般會下載源碼在本地編譯或者下載對應版本的編譯后的文件,但是我們使用的庫還可能包含別人的庫,別人的庫可能還使用了別別人寫的庫,這樣一個個下載編譯太過麻煩,而且有些庫還存在多次引入的可能,因此我們需要一個工具幫助我們管理包和依賴,這里介紹conan
2 conan
conan是一個c++包管理工具,一行代碼就能將我們需要的包下載到本地並進行編譯
注意:目前已知在windows + gcc存在bug,導致編譯失敗,我也不知什么原因,stackoverflow上有一個提問,說是由於兼容性問題,這里我是直接在linux平台使用
2.1 下載conan
下載很簡單,直接通過pip下載
pip install conan
稍等片刻,就下載好了,這個時候如果我們輸入conan --version
可能會找不到命令,這是因為環境變量沒有添加,添加環境變量網上教程很多
2.2 添加conan配置文件
conanfile.txt
這里包含兩項,第一項是要下載的庫和版本號,第二項是指定生成的管理格式,這里我們選擇cmake
以使用poco庫為例,我們只需在conanfile.txt
中寫
[requires]
poco/1.11.1
[generators]
cmake
這里我們怎么知道所使用的庫有哪些版本呢?
可以使用命令conan search poco -r conancenter
獲取,其中-r conancenter
指定我們需要在conan中央倉庫搜索,否則默認本地搜索,要添加其它庫,直接在[requires]
下添加庫名和版本號,然后重新安裝就好了
2.3 安裝庫
我們以及創建好好conan配置文件,下一步,進入build文件夾(這個文件夾就是我們存放cmake生成文件的地方哦),然后一行命令conan install .
即可靜靜等待下載安裝完成了
,
注意事項: 這個時候可能需要我們指定一些配置信息,配置信息在
~/.conan/profiles/default
文件里,配置信息需要添加的內容在~/.conan/settings.yml
文件里,對於gcc,需要配置compiler.libcxx=libstdc++11
否則以舊版本安裝,這里列出我的配置文件供參考
[settings]
os=Linux
os_build=Linux
arch=x86_64
arch_build=x86_64
build_type=Release
compiler=gcc
compiler.libcxx=libstdc++11
compiler.version=9
[options]
[build_requires]
[env]
在這插一條 剛剛吃完飯准備把build文件夾的緩存刪了,然后測試一下看看寫的對不對,准備輸rm -rf build/* 結果輸成了rm -rf /*,好家伙.....自閉中...
2.4 在cmake中配置
只需要在頂層CMakeLists.txt文件中添加
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
${CMAKE_BINARY_DIR}
表示當前build文件夾路徑, 然后在mian.cpp里引用頭文件即可
2.5 使用
現在我么可以使用cmake編譯我們我們的工程了
進入到build文件夾下,輸入cmake ..
等待生成makefile文件完成后,輸入cmake build .
等待編譯成功了
附錄
附錄1:cmake變量常用變量
PROJECT_SOURCE_DIR
:工程的根目錄,頂層CMakeLists.txt所在的目錄
PROJECT_BINARY_DIR
:cmake生成文件保存的目錄,通常為build目錄
PROJECT_NAME
:項目名
CMAKE_CURRENT_SOURCE_DIR
:當前CMakeLists.txt所在的路徑
EXECUTABLE_OUTPUT_PATH
:重新定義目標二進制可執行文件的存放位置
LIBRARY_OUTPUT_PATH
:重新定義目標鏈接庫文件的存放位置
使用格式 ${value}
附錄2: 版本號字段 PROJECT-NAME
:當前項目名
PROJECT-NAME_VERSION_MAJOR
:第一個字段
PROJECT-NAME_VERSION_MINOR
:第二個字段
PROJECT-NAME_VERSION_PATCH
:第三個字段
PROJECT-NAME_VERSION_TWEAK
:第四個字段
附錄3:更進一步的學習鏈接
- https://www.zhihu.com/column/c_1369781372333240320 知乎: 很酷的程序員 cmke
- https://blog.csdn.net/weixin_39773239/article/details/113052000 CSDN: weixin_39773239 cmake
- https://www.bilibili.com/video/BV14h41187FZ B站:IPADS cmake
- https://www.bilibili.com/video/BV1wL411u74B B站: bennyhuo不是算命的 conan
- https://cmake.org/cmake/help/v3.22/ cmake官方文檔