CMake

All problems in computer science can be solved by another level of indirection.
Make工具有很多種,不同的Make工具遵循著不同的規(guī)范和標準,因此其執(zhí)行的Makefile文件也千差萬別。對與跨平臺編譯,如果用上面的Make工具就需編寫不同標準的Makefile文件,這樣就很麻煩。
Cmake就是針對這一問題,通過編寫CMakeLists.txt文件來制定編譯流程,生成Makefile文件。

cmake步驟

1.編寫CMakeLists.txt文件
2.cmake
3.make

常用語法:

cmake_minimum_required(VERSION 3.10) 指定版本
project(armor) 工程名稱
set(CMAKE_BUILD_TYPE RELEASE) 指定編譯類型
include_directories(include) 添加頭文件目錄
file(GLOB SOURCE "src/*.cpp" "main.cpp") 源文件
add_library(armor SHARED ${SOURCE}) 生成動態(tài)鏈接庫
add_library(armor STATIC ${SOURCE}) 生成靜態(tài)鏈接庫
set(PROJECT_LINK_LIBS libarmor.so) 將庫文件存到變量中
link_directories(/home/wenda/cmake/demo_4/build) 添加外部庫的搜索路徑
target_link_libraries(main ${PROJECT_LINK_LIBS}) 鏈接外部庫文件
add_executable(main main.cpp) 將源文件生成可執(zhí)行文件


Demo

demo_1
├── CMakeLists.txt
└── main.cpp

cmake_minimum_required(VERSION 3.10) #指定版本號

project(main) #工程名稱

add_executable(main main.cpp) #把源文件生成可執(zhí)行文件


demo_2
├── CMakeLists.txt
├── main.cpp
└── print_.cpp

cmake_minimum_required(VERSION 3.10) #指定版本

project(main) #工程名稱

aux_source_directory(. dir_srcs) #將目錄下的所有源文件存到變量中

add_executable(main ${dir_srcs}) #把源文件生成可執(zhí)行文件


demo_3
├── build
├── CMakeLists.txt
├── include
│?├── input_A.h
│?└── input_B.h
├── main.cpp
└── src
? ├── input_A.cpp
? └── input_B.cpp

cmake_minimum_required(VERSION 3.10) #指定版本

project(main) #工程名稱

include_directories(include) #添加頭文件目錄

#set(SOURCE main.cpp input_A.cpp input_B.cpp) #源文件

file(GLOB SOURCE "src/*.cpp" "main.cpp") #源文件

add_executable(main ${SOURCE}) #把源文件生成可執(zhí)行文件


demo_4 生成動態(tài)庫文件
├── build
├── CMakeLists.txt
├── include
│ ?└── armor.h
└── src
?└── armor.cpp

cmake_minimum_required(VERSION 3.10) #指定版本

set(CMAKE_BUILD_TYPE RELEASE) #指定編譯類型

project(armor) #工程名稱

include_directories(include) #添加頭文件目錄

file(GLOB SOURCE "src/*.cpp") #源文件

add_library(armor SHARED ${SOURCE}) #生成動態(tài)鏈接庫


demo_5 生成靜態(tài)庫文件
├── build
├── CMakeLists.txt
├── include
│? └── armor.h
└── src
? └── armor.cpp

cmake_minimum_required(VERSION 3.10) #指定版本

set(CMAKE_BUILD_TYPE RELEASE) #指定編譯類型

project(armor) #工程名稱

include_directories(include) #添加頭文件目錄

file(GLOB SOURCE "src/*.cpp") #源文件

add_library(armor STATIC ${SOURCE}) #生成靜態(tài)鏈接庫


demo_6 調(diào)用動態(tài)庫或者靜態(tài)庫
├── build
├── CMakeLists.txt
└── main.cpp

cmake_minimum_required(VERSION 3.10) #指定版本

project(main) #工程名稱

set(PROJECT_LINK_LIBS libarmor.so) #將庫文件存到變量中

#set(PROJECT_LINK_LIBS libarmor.a)

link_directories(/home/wenda/cmake/demo_4/build) #添加外部庫的搜索
路徑

#link_directories(/home/wenda/cmake/demo_5/build)

include_directories(../demo_4/include) #包含庫對應(yīng)的頭文件

#include_directories(../demo_5/include)

add_executable(main main.cpp)

target_link_libraries(main ${PROJECT_LINK_LIBS}) #鏈接外部庫文件

輸出文件的目錄

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/output) 可執(zhí)行文件目錄

set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) 庫文件目錄

常用變量

CMAKE_SOURCE_DIR, PROJECT_SOURCE_DIR:這兩個變量內(nèi)容一致,都指的是工程的頂級目錄。
CMAKE_CURRENT_BINARY_DIR:外部編譯時,指的是target目錄,內(nèi)部編譯時,指的是頂級目錄
CMAKE_CURRENT_SOURCE_DIR:CMakeList.txt所在的目錄
CMAKE_CURRENT_LIST_DIR:CMakeList.txt的完整路徑
CMAKE_CURRENT_LIST_LINE:當前所在的行
CMAKE_MODULE_PATH:如果工程復(fù)雜,可能需要編寫一些cmake模塊,這里通過SET指定這個變量
LIBRARY_OUTPUT_DIR, BINARY_OUTPUT_DIR:庫和可執(zhí)行的最終存放目錄
PROJECT_NAME, CMAKE_PROJECT_NAME:前者是當前CMakeList.txt里設(shè)置的project_name,后者是整個項目配置的project_name

cmake官方鏈接:

https://cmake.org/cmake/help/latest/guide/tutorial/index.html
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容