【cmake系列使用教程】
這個系列的文章翻譯自官方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.txt
、Makefile
、cmake_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
複製程式碼
即可看到輸出內容: