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