cmake使用教程(一)-起步

saka發表於2018-01-29

【cmake系列使用教程】

cmake使用教程(一)-起步

cmake使用教程(二)-新增庫

cmake使用教程(三)-安裝、測試、系統自檢

cmake使用教程(四)-檔案生成器

cmake使用教程(五)-cpack生成安裝包

cmake使用教程(六)-蛋疼的語法

cmake使用教程(七)-流程和迴圈

cmake使用教程(八)-macro和function

這個系列的文章翻譯自官方cmake教程:cmake tutorial

示例程式地址:github.com/rangaofei/t…

不會僅僅停留在官方教程。本人作為一個安卓開發者,實在是沒有linux c程式開發經驗,望大佬們海涵。教程是在macos下完成,大部分linux我也測試過,有特殊說明的我會標註出來。本教程基於cmake-3.10.2,同時認為你已經安裝好cmake。

基本語法

一個最基本的CmakeLists.txt檔案最少需要包含以下三行:

cmake_minimum_required (VERSION 2.6)
project (Tutorial)
add_executable(Tutorial tutorial.cxx)
複製程式碼

注意:cmake的語法支援大小、小寫和大小寫混合上邊的程式碼中我們使用的cmake語法是小寫的.

cmake_minimum_required
CMAKE_MINIMUM_REQUIRED
cmake_MINUMUM_required
複製程式碼

上面三種寫法是相同的,注意,只有系統指令是不區分大小寫的,但是變數和字串是區分大小寫的。

建立一個tutorial.cxx檔案,用來計算一個數字的平方根,內容如下:

// A simple program that computes the square root of a number
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main (int argc, char *argv[])
{
  if (argc < 2)
    {
    fprintf(stdout,"Usage: %s number\n",argv[0]);
    return 1;
    }
  double inputValue = atof(argv[1]);
  double outputValue = sqrt(inputValue);
  fprintf(stdout,"The square root of %g is %g\n",
          inputValue, outputValue);
  return 0;
}
複製程式碼

這樣就完成一個最簡單的cmake程式。

構建程式

用cmake來編譯這段程式碼,進入命令列執行內部構建命令(後邊會講外部構建):

cmake .
複製程式碼

這是輸出一系列的log資訊

-- The C compiler identification is AppleClang 9.0.0.9000039
-- The CXX compiler identification is AppleClang 9.0.0.9000039
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/saka/Desktop/Tutorial/Step1
複製程式碼

同時生成了三個檔案CMakeCache.txtMakefilecmake_install.cmake和一個資料夾CmakeFiles,然後執行

make 
複製程式碼

即可生成可執行程式Tutorial。在ubuntu或者centos上可能會提示找不到math.h檔案,這時候我們需要在cmakeLists.txt檔案中最後新增

target_link_libraries(Tutorial apue.a)
複製程式碼

然後重新編譯即可。需要刪除剛才生成的額外的檔案。

新增版本號

下面講解如何為程式新增版本號和帶有使用版本號的標頭檔案。

set(KEY VALUE)接受兩個引數,用來宣告變數。在camke語法中使用KEY並不能直接取到VALUE,必須使用${KEY}這種寫法來取到VALUE

cmake_minimum_required (VERSION 2.6)
project (Tutorial)
# The version number.
set (Tutorial_VERSION_MAJOR 1)
set (Tutorial_VERSION_MINOR 0)
 
# configure a header file to pass some of the CMake settings
# to the source code
configure_file (
  "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
  "${PROJECT_BINARY_DIR}/TutorialConfig.h"
  )
 
# add the binary tree to the search path for include files
# so that we will find TutorialConfig.h
include_directories("${PROJECT_BINARY_DIR}")
 
# add the executable
add_executable(Tutorial tutorial.cxx)
複製程式碼

配置檔案將會被寫入到可執行檔案目錄下,所以我們的專案必須包含這個資料夾來使用這些配置標頭檔案。我們需要在工程目錄下新建一個TutorialConfig.h.in,內容如下:

// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
複製程式碼

上面的程式碼中的@Tutorial_VERSION_MAJOR@@Tutorial_VERSION_MINOR@將會被替換為CmakeLists.txt中的1和0。 然後修改Tutorial.cxx檔案如下,用來在不輸入額外引數的情況下輸出版本資訊:

// A simple program that computes the square root of a number
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "TutorialConfig.h"
 
int main (int argc, char *argv[])
{
  if (argc < 2)
    {
    fprintf(stdout,"%s Version %d.%d\n",
            argv[0],
            Tutorial_VERSION_MAJOR,
            Tutorial_VERSION_MINOR);
    fprintf(stdout,"Usage: %s number\n",argv[0]);
    return 1;
    }
  double inputValue = atof(argv[1]);
  double outputValue = sqrt(inputValue);
  fprintf(stdout,"The square root of %g is %g\n",
          inputValue, outputValue);
  return 0;
}
複製程式碼

然後執行

cmake .
make
./Tutorial
複製程式碼

即可看到輸出內容:

cmake使用教程(一)-起步

相關文章