Cmake 入門

weixin_33850890發表於2017-09-18

Cmake 入門

前言

  • CMake是一個比make更高階的編譯配置工具,它可以根據不同平臺、不同的編譯器,生成相應的Makefile或者vcproj專案
  • 通過編寫CMakeLists.txt,可以控制生成的Makefile,從而控制編譯過程。CMake自動生成的Makefile不僅可以通過make命令構建專案生成目標檔案,還支援安裝(make install)、測試安裝的程式是否能正確執行(make test,或者ctest)、生成當前平臺的安裝包(make package)、生成原始碼包(make package_source)、產生Dashboard顯示資料並上傳等高階功能,只要在CMakeLists.txt中簡單配置,就可以完成很多複雜的功能,包括寫測試用例。
  • 如果有巢狀目錄,子目錄下可以有自己的CMakeLists.txt。

下載

下載網頁
https://cmake.org/download/
下載地址
https://cmake.org/files/v3.9/cmake-3.9.2-win64-x64.msi

示例

結構


├── build
    
├── include
|    └── add.h
└── src
    ├── add.c
    └── main.c
── CMakeLists.txt


程式碼

  • add.h
int add(int a,int b);
  • add.c
#include "../include/add.h"
int add(int a,int b)
{
    return a+b;
}
  • main.c
#include "../include/add.h"
#include <stdio.h>
int main(int argc,char** argv)
{
    int reslut=add(3,4);
    printf("結果 %d ",reslut);
    return 0;
}
  • CMakeLists.txt
#1.cmake verson,指定cmake版本 
cmake_minimum_required(VERSION 2.6)
#2.project name,指定專案的名稱,一般和專案的資料夾名稱對應
PROJECT(main)

#包含的標頭檔案目錄  
INCLUDE_DIRECTORIES(
include
)

#指定原始檔目錄
AUX_SOURCE_DIRECTORY(src DIR_SRCS)


MESSAGE(STATUS "開始構建")       
#設定
SET(TEST_MATH ${DIR_SRCS})
ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH})
  • CMake命令是大小寫不敏感的,你可以用大寫,也可以用小寫,也可以混寫。
  • ${CMAKE_CURRENT_SOURCE_DIR}表示CMakeLists.txt所在的目錄

語法

  1. 註釋

  2. 變數:使用set命令顯式定義及賦值,在非if語句中,使用${}引用,if中直接使用變數名引用;
    後續的set命令會清理變數原來的值;

  3. command (args ...)
    命令不分大小寫,引數使用空格分隔,使用雙引號引起引數中空格

  4. set(var a;b;c) <=> set(var a b c)
    定義變數var並賦值為a;b;c這樣一個string list

  5. Add_executable(${var}) <=> Add_executable(a b c)
    變數使用${xxx}引用

  6. 條件語句:
    if(var) #var 非empty 0 N No OFF FALSE... #非運算使用NOT

else()/elseif() … endif(var)

  1. 迴圈語句
    Set(VAR a b c)
    Foreach(f ${VAR}) …Endforeach(f)

  2. 迴圈語句
    WHILE() … ENDWHILE()

內部變數

  1. CMAKE_C_COMPILER:指定C編譯器
  2. CMAKE_CXX_COMPILER:
  3. CMAKE_C_FLAGS:編譯C檔案時的選項,如-g;也可以通過add_definitions新增編譯選項
  4. EXECUTABLE_OUTPUT_PATH:可執行檔案的存放路徑
  5. LIBRARY_OUTPUT_PATH:庫檔案路徑
  6. CMAKE_BUILD_TYPE::build 型別(Debug, Release, ...),CMAKE_BUILD_TYPE=Debug
  7. BUILD_SHARED_LIBS:Switch between shared and static libraries

命令

  • project (HELLO) #指定專案名稱,生成的VC專案的名稱;

使用${HELLO_SOURCE_DIR}表示專案根目錄

  • include_directories:指定標頭檔案的搜尋路徑,相當於指定gcc的-I引數

include_directories (${HELLO_SOURCE_DIR}/Hello) #增加Hello為include目錄

  • link_directories:動態連結庫或靜態連結庫的搜尋路徑,相當於gcc的-L引數

link_directories (${HELLO_BINARY_DIR}/Hello) #增加Hello為link目錄

  • add_subdirectory:包含子目錄

add_subdirectory (Hello)

  • add_executable:編譯可執行程式,指定編譯,好像也可以新增.o檔案

add_executable (helloDemo demo.cxx demo_b.cxx) #將cxx編譯成可執行檔案——

  • add_definitions:新增編譯引數

add_definitions(-DDEBUG)將在gcc命令列新增DEBUG巨集定義;

add_definitions( “-Wall -ansi –pedantic –g”)

  • target_link_libraries:新增連結庫,相同於指定-l引數

target_link_libraries(demo Hello) #將可執行檔案與Hello連線成最終檔案demo

  • add_library:

add_library(Hello hello.cxx) #將hello.cxx編譯成靜態庫如libHello.a

  • add_custom_target:

  • message( status|fatal_error, “message”):

  • 在指定目錄下搜尋一個庫, 儲存在變數MY_LIB中

find_ibrary(MY_LIB libmylib.a ./)

  • set_target_properties( ... ):

lots of properties... OUTPUT_NAME, VERSION,....

  • link_libraries( lib1 lib2 ...):

All targets link with the same set of libs

相關文章