分享一篇很不錯的CMake入門文章,值得收藏細讀!

2021-12-29 嵌入式大雜燴
什麼是 CMake

你或許聽過好幾種 Make 工具,例如 GNU Make ,QT 的 qmake ,微軟的 MS nmake,BSD Make(pmake),Makepp,等等。這些 Make 工具遵循著不同的規範和標準,所執行的 Makefile 格式也千差萬別。

這樣就帶來了一個嚴峻的問題:如果軟體想跨平臺,必須要保證能夠在不同平臺編譯。而如果使用上面的 Make 工具,就得為每一種標準寫一次 Makefile ,這將是一件讓人抓狂的工作。

CMake 就是針對上面問題所設計的工具:它首先允許開發者編寫一種平臺無關的 CMakeList.txt 文件來定製整個編譯流程,然後再根據目標用戶的平臺進一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。

從而做到「Write once, run everywhere」。顯然,CMake 是一個比上述幾種 make 更高級的編譯配置工具。一些使用 CMake 作為項目架構系統的知名開源項目有 VTK、ITK、KDE、OpenCV、OSG 等 [1]。

在 linux 平臺下使用 CMake 生成 Makefile 並編譯的流程如下:

編寫 CMake 配置文件 CMakeLists.txt 。執行命令 cmake PATH 或者 ccmake PATH 生成 Makefile(ccmake 和 cmake 的區別在於前者提供了一個交互式的界面)。其中, PATH 是 CMakeLists.txt 所在的目錄。

本文將從實例入手,一步步講解 CMake 的常見用法,文中所有的實例代碼可以在這裡找到。如果你讀完仍覺得意猶未盡,可以繼續學習我在文章末尾提供的其他資源。

入門案例:單個源文件

本節對應的原始碼所在目錄:

https://github.com/wzpan/cmake-demo/tree/master/Demo1

對於簡單的項目,只需要寫幾行代碼就可以了。例如,假設現在我們的項目中只有一個源文件 main.cc ,該程序的用途是計算一個數的指數冪。

#include <stdio.h>
#include <stdlib.h>

/**
 * power - Calculate the power of number.
 * @param base: Base value.
 * @param exponent: Exponent value.
 *
 * @return base raised to the power exponent.
 */
double power(double base, int exponent)
{
    int result = base;
    int i;
    
    if (exponent == 0) {
        return 1;
    }
    
    for(i = 1; i < exponent; ++i){
        result = result * base;
    }

    return result;
}

int main(int argc, char *argv[])
{
    if (argc < 3){
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }
    double base = atof(argv[1]);
    int exponent = atoi(argv[2]);
    double result = power(base, exponent);
    printf("%g ^ %d is %g\n", base, exponent, result);
    return 0;
}

編寫 CMakeLists.txt

首先編寫 CMakeLists.txt 文件,並保存在與 main.cc 源文件同個目錄下:

# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)

# 項目信息
project (Demo1)

# 指定生成目標
add_executable(Demo main.cc)

CMakeLists.txt 的語法比較簡單,由命令、注釋和空格組成,其中命令是不區分大小寫的。符號 # 後面的內容被認為是注釋。命令由命令名稱、小括號和參數組成,參數之間使用空格進行間隔。

對於上面的 CMakeLists.txt 文件,依次出現了幾個命令:

cmake_minimum_required:指定運行此配置文件所需的 CMake 的最低版本;project:參數值是 Demo1,該命令表示項目的名稱是 Demo1 。add_executable:將名為 main.cc 的源文件編譯成一個名稱為 Demo 的可執行文件。編譯項目

之後,在當前目錄執行 cmake . ,得到 Makefile 後再使用 make 命令編譯得到 Demo1 可執行文件。

[ehome@xman Demo1]$ cmake .
-- The C compiler identification is GNU 4.8.2
-- The CXX compiler identification is GNU 4.8.2
-- Check for working C compiler: /usr/sbin/cc
-- Check for working C compiler: /usr/sbin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/sbin/c++
-- Check for working CXX compiler: /usr/sbin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ehome/Documents/programming/C/power/Demo1
[ehome@xman Demo1]$ make
Scanning dependencies of target Demo
[100%] Building C object CMakeFiles/Demo.dir/main.cc.o
Linking C executable Demo
[100%] Built target Demo
[ehome@xman Demo1]$ ./Demo 5 4
5 ^ 4 is 625
[ehome@xman Demo1]$ ./Demo 7 3
7 ^ 3 is 343
[ehome@xman Demo1]$ ./Demo 2 10
2 ^ 10 is 1024

多個源文件同一目錄,多個源文件

本小節對應的原始碼所在目錄:

https://github.com/wzpan/cmake-demo/tree/master/Demo2

上面的例子只有單個源文件。現在假如把 power 函數單獨寫進一個名為 MathFunctions.c 的源文件裡,使得這個工程變成如下的形式:

./Demo2
    |
    +--- main.cc
    |
    +--- MathFunctions.cc
    |
    +--- MathFunctions.h

這個時候,CMakeLists.txt 可以改成如下的形式:

# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)

# 項目信息
project (Demo2)

# 指定生成目標
add_executable(Demo main.cc MathFunctions.cc)

唯一的改動只是在 add_executable 命令中增加了一個 MathFunctions.cc 源文件。這樣寫當然沒什麼問題,但是如果源文件很多,把所有源文件的名字都加進去將是一件煩人的工作。更省事的方法是使用 aux_source_directory 命令,該命令會查找指定目錄下的所有源文件,然後將結果存進指定變量名。其語法如下:

aux_source_directory(<dir> <variable>)

因此,可以修改 CMakeLists.txt 如下:

# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)

# 項目信息
project (Demo2)

# 查找當前目錄下的所有源文件
# 並將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)

# 指定生成目標
add_executable(Demo ${DIR_SRCS})

這樣,CMake 會將當前目錄所有源文件的文件名賦值給變量 DIR_SRCS ,再指示變量 DIR_SRCS 中的源文件需要編譯成一個名稱為 Demo 的可執行文件。

多個目錄,多個源文件

本小節對應的原始碼所在目錄:

https://github.com/wzpan/cmake-demo/tree/master/Demo3

現在進一步將 MathFunctions.h 和 MathFunctions.cc 文件移動到 math 目錄下。

./Demo3
    |
    +--- main.cc
    |
    +--- math/
          |
          +--- MathFunctions.cc
          |
          +--- MathFunctions.h

對於這種情況,需要分別在項目根目錄 Demo3 和 math 目錄裡各編寫一個 CMakeLists.txt 文件。為了方便,我們可以先將 math 目錄裡的文件編譯成靜態庫再由 main 函數調用。

根目錄中的 CMakeLists.txt :

# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)

# 項目信息
project (Demo3)

# 查找當前目錄下的所有源文件
# 並將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)

# 添加 math 子目錄
add_subdirectory(math)

# 指定生成目標 
add_executable(Demo main.cc)

# 添加連結庫
target_link_libraries(Demo MathFunctions)

該文件添加了下面的內容: 第3行,使用命令 add_subdirectory 指明本項目包含一個子目錄 math,這樣 math 目錄下的 CMakeLists.txt 文件和原始碼也會被處理 。第6行,使用命令 target_link_libraries 指明可執行文件 main 需要連接一個名為 MathFunctions 的連結庫 。

子目錄中的 CMakeLists.txt:

# 查找當前目錄下的所有源文件
# 並將名稱保存到 DIR_LIB_SRCS 變量
aux_source_directory(. DIR_LIB_SRCS)

# 生成連結庫
add_library (MathFunctions ${DIR_LIB_SRCS})

在該文件中使用命令 add_library 將 src 目錄中的源文件編譯為靜態連結庫。

自定義編譯選項

本節對應的原始碼所在目錄:

https://github.com/wzpan/cmake-demo/tree/master/Demo4

CMake 允許為項目增加編譯選項,從而可以根據用戶的環境和需求選擇最合適的編譯方案。

例如,可以將 MathFunctions 庫設為一個可選的庫,如果該選項為 ON ,就使用該庫定義的數學函數來進行運算。否則就調用標準庫中的數學函數庫。

修改 CMakeLists 文件

我們要做的第一步是在頂層的 CMakeLists.txt 文件中添加該選項:

# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)

# 項目信息
project (Demo4)

# 加入一個配置頭文件,用於處理 CMake 對源碼的設置
configure_file (
  "${PROJECT_SOURCE_DIR}/config.h.in"
  "${PROJECT_BINARY_DIR}/config.h"
  )

# 是否使用自己的 MathFunctions 庫
option (USE_MYMATH
       "Use provided math implementation" ON)

# 是否加入 MathFunctions 庫
if (USE_MYMATH)
  include_directories ("${PROJECT_SOURCE_DIR}/math")
  add_subdirectory (math)  
  set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)

# 查找當前目錄下的所有源文件
# 並將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)

# 指定生成目標
add_executable(Demo ${DIR_SRCS})
target_link_libraries (Demo  ${EXTRA_LIBS})

其中:

第7行的 configure_file 命令用於加入一個配置頭文件 config.h ,這個文件由 CMake 從 config.h.in 生成,通過這樣的機制,將可以通過預定義一些參數和變量來控制代碼的生成。第13行的 option 命令添加了一個 USE_MYMATH 選項,並且默認值為 ON 。第17行根據 USE_MYMATH 變量的值來決定是否使用我們自己編寫的 MathFunctions 庫。修改 main.cc 文件

之後修改 main.cc 文件,讓其根據 USE_MYMATH 的預定義值來決定是否調用標準庫還是 MathFunctions 庫:

#include <stdio.h>
#include <stdlib.h>
#include "config.h"

#ifdef USE_MYMATH
  #include "math/MathFunctions.h"
#else
  #include <math.h>
#endif


int main(int argc, char *argv[])
{
    if (argc < 3){
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }
    double base = atof(argv[1]);
    int exponent = atoi(argv[2]);
    
#ifdef USE_MYMATH
    printf("Now we use our own Math library. \n");
    double result = power(base, exponent);
#else
    printf("Now we use the standard library. \n");
    double result = pow(base, exponent);
#endif
    printf("%g ^ %d is %g\n", base, exponent, result);
    return 0;
}

編寫 config.h.in 文件

上面的程序值得注意的是第2行,這裡引用了一個 config.h 文件,這個文件預定義了 USE_MYMATH 的值。但我們並不直接編寫這個文件,為了方便從 CMakeLists.txt 中導入配置,我們編寫一個 config.h.in 文件,內容如下:

#cmakedefine USE_MYMATH

這樣 CMake 會自動根據 CMakeLists 配置文件中的設置自動生成 config.h 文件。

編譯項目

現在編譯一下這個項目,為了便於交互式的選擇該變量的值,可以使用 ccmake 命令(也可以使用 cmake -i 命令,該命令會提供一個會話式的交互式配置界面):

CMake的交互式配置界面

CMake的交互式配置界面

從中可以找到剛剛定義的 USE_MYMATH 選項,按鍵盤的方向鍵可以在不同的選項窗口間跳轉,按下 enter 鍵可以修改該選項。修改完成後可以按下 c 選項完成配置,之後再按 g 鍵確認生成 Makefile 。ccmake 的其他操作可以參考窗口下方給出的指令提示。

我們可以試試分別將 USE_MYMATH 設為 ON 和 OFF 得到的結果:

USE_MYMATH 為 ON

運行結果:

[ehome@xman Demo4]$ ./Demo
Now we use our own MathFunctions library. 
 7 ^ 3 = 343.000000
 10 ^ 5 = 100000.000000
 2 ^ 10 = 1024.000000

此時 config.h 的內容為:

#define USE_MYMATH

USE_MYMATH 為 OFF

運行結果:

[ehome@xman Demo4]$ ./Demo
Now we use the standard library. 
 7 ^ 3 = 343.000000
 10 ^ 5 = 100000.000000
 2 ^ 10 = 1024.000000

此時 config.h 的內容為:

/* #undef USE_MYMATH */

安裝和測試

本節對應的原始碼所在目錄:

https://github.com/wzpan/cmake-demo/tree/master/Demo5

CMake 也可以指定安裝規則,以及添加測試。這兩個功能分別可以通過在產生 Makefile 後使用 make install 和 make test 來執行。

在以前的 GNU Makefile 裡,你可能需要為此編寫 install 和 test 兩個偽目標和相應的規則,但在 CMake 裡,這樣的工作同樣只需要簡單的調用幾條命令。

定製安裝規則

首先先在 math/CMakeLists.txt 文件裡添加下面兩行:

# 指定 MathFunctions 庫的安裝路徑
install (TARGETS MathFunctions DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)

指明 MathFunctions 庫的安裝路徑。之後同樣修改根目錄的 CMakeLists 文件,在末尾添加下面幾行:

# 指定安裝路徑
install (TARGETS Demo DESTINATION bin)
install (FILES "${PROJECT_BINARY_DIR}/config.h"
         DESTINATION include)

通過上面的定製,生成的 Demo 文件和 MathFunctions 函數庫 libMathFunctions.o 文件將會被複製到 /usr/local/bin 中,而 MathFunctions.h 和生成的 config.h 文件則會被複製到 /usr/local/include 中。

我們可以驗證一下(順帶一提的是,這裡的 /usr/local/ 是默認安裝到的根目錄,可以通過修改 CMAKE_INSTALL_PREFIX 變量的值來指定這些文件應該拷貝到哪個根目錄):

[ehome@xman Demo5]$ sudo make install
[ 50%] Built target MathFunctions
[100%] Built target Demo
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/bin/Demo
-- Installing: /usr/local/include/config.h
-- Installing: /usr/local/bin/libMathFunctions.a
-- Up-to-date: /usr/local/include/MathFunctions.h
[ehome@xman Demo5]$ ls /usr/local/bin
Demo  libMathFunctions.a
[ehome@xman Demo5]$ ls /usr/local/include
config.h  MathFunctions.h

為工程添加測試

添加測試同樣很簡單。CMake 提供了一個稱為 CTest 的測試工具。我們要做的只是在項目根目錄的 CMakeLists 文件中調用一系列的 add_test 命令。

# 啟用測試
enable_testing()

# 測試程序是否成功運行
add_test (test_run Demo 5 2)

# 測試幫助信息是否可以正常提示
add_test (test_usage Demo)
set_tests_properties (test_usage
  PROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")

# 測試 5 的平方
add_test (test_5_2 Demo 5 2)

set_tests_properties (test_5_2
 PROPERTIES PASS_REGULAR_EXPRESSION "is 25")

# 測試 10 的 5 次方
add_test (test_10_5 Demo 10 5)

set_tests_properties (test_10_5
 PROPERTIES PASS_REGULAR_EXPRESSION "is 100000")

# 測試 2 的 10 次方
add_test (test_2_10 Demo 2 10)

set_tests_properties (test_2_10
 PROPERTIES PASS_REGULAR_EXPRESSION "is 1024")

上面的代碼包含了四個測試。第一個測試 test_run 用來測試程序是否成功運行並返回 0 值。剩下的三個測試分別用來測試 5 的 平方、10 的 5 次方、2 的 10 次方是否都能得到正確的結果。其中 PASS_REGULAR_EXPRESSION 用來測試輸出是否包含後面跟著的字符串。

讓我們看看測試的結果:

[ehome@xman Demo5]$ make test
Running tests...
Test project /home/ehome/Documents/programming/C/power/Demo5
    Start 1: test_run
1/4 Test #1: test_run    Passed    0.00 sec
    Start 2: test_5_2
2/4 Test #2: test_5_2    Passed    0.00 sec
    Start 3: test_10_5
3/4 Test #3: test_10_5 ....   Passed    0.00 sec
    Start 4: test_2_10
4/4 Test #4: test_2_10 ....   Passed    0.00 sec

100% tests passed, 0 tests failed out of 4

Total Test time (real) =   0.01 sec

如果要測試更多的輸入數據,像上面那樣一個個寫測試用例未免太繁瑣。這時可以通過編寫宏來實現:

# 定義一個宏,用來簡化測試工作
macro (do_test arg1 arg2 result)
  add_test (test_${arg1}_${arg2} Demo ${arg1} ${arg2})
  set_tests_properties (test_${arg1}_${arg2}
    PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro (do_test)
 
# 使用該宏進行一系列的數據測試
do_test (5 2 "is 25")
do_test (10 5 "is 100000")
do_test (2 10 "is 1024")

關於 CTest 的更詳細的用法可以通過 man 1 ctest 參考 CTest 的文檔。

支持 gdb

讓 CMake 支持 gdb 的設置也很容易,只需要指定 Debug 模式下開啟 -g 選項:

set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

之後可以直接對生成的程序使用 gdb 來調試。

添加環境檢查

本節對應的原始碼所在目錄:

https://github.com/wzpan/cmake-demo/tree/master/Demo6

有時候可能要對系統環境做點檢查,例如要使用一個平臺相關的特性的時候。在這個例子中,我們檢查系統是否自帶 pow 函數。如果帶有 pow 函數,就使用它;否則使用我們定義的 power 函數。

添加 CheckFunctionExists 宏

首先在頂層 CMakeLists 文件中添加 CheckFunctionExists.cmake 宏,並調用 check_function_exists 命令測試連結器是否能夠在連結階段找到 pow 函數。

# 檢查系統是否支持 pow 函數
include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
check_function_exists (pow HAVE_POW)

將上面這段代碼放在 configure_file 命令前。

預定義相關宏變量

接下來修改 config.h.in 文件,預定義相關的宏變量。

// does the platform provide pow function?
#cmakedefine HAVE_POW

在代碼中使用宏和函數

最後一步是修改 main.cc ,在代碼中使用宏和函數:

#ifdef HAVE_POW
    printf("Now we use the standard library. \n");
    double result = pow(base, exponent);
#else
    printf("Now we use our own Math library. \n");
    double result = power(base, exponent);
#endif

添加版本號

本節對應的原始碼所在目錄:

https://github.com/wzpan/cmake-demo/tree/master/Demo7

給項目添加和維護版本號是一個好習慣,這樣有利於用戶了解每個版本的維護情況,並及時了解當前所用的版本是否過時,或是否可能出現不兼容的情況。

首先修改頂層 CMakeLists 文件,在 project 命令之後加入如下兩行:

set (Demo_VERSION_MAJOR 1)
set (Demo_VERSION_MINOR 0)

分別指定當前的項目的主版本號和副版本號。

之後,為了在代碼中獲取版本信息,我們可以修改 config.h.in 文件,添加兩個預定義變量:

// the configured options and settings for Tutorial
#define Demo_VERSION_MAJOR @Demo_VERSION_MAJOR@
#define Demo_VERSION_MINOR @Demo_VERSION_MINOR@

這樣就可以直接在代碼中列印版本信息了:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "config.h"
#include "math/MathFunctions.h"

int main(int argc, char *argv[])
{
    if (argc < 3){
        // print version info
        printf("%s Version %d.%d\n",
            argv[0],
            Demo_VERSION_MAJOR,
            Demo_VERSION_MINOR);
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }
    double base = atof(argv[1]);
    int exponent = atoi(argv[2]);
    
#if defined (HAVE_POW)
    printf("Now we use the standard library. \n");
    double result = pow(base, exponent);
#else
    printf("Now we use our own Math library. \n");
    double result = power(base, exponent);
#endif
    
    printf("%g ^ %d is %g\n", base, exponent, result);
    return 0;
}

生成安裝包

本節對應的原始碼所在目錄:

https://github.com/wzpan/cmake-demo/tree/master/Demo8

本節將學習如何配置生成各種平臺上的安裝包,包括二進位安裝包和源碼安裝包。為了完成這個任務,我們需要用到 CPack ,它同樣也是由 CMake 提供的一個工具,專門用於打包。

首先在頂層的 CMakeLists.txt 文件尾部添加下面幾行:

# 構建一個 CPack 安裝包
include (InstallRequiredSystemLibraries)
set (CPACK_RESOURCE_FILE_LICENSE
  "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set (CPACK_PACKAGE_VERSION_MAJOR "${Demo_VERSION_MAJOR}")
set (CPACK_PACKAGE_VERSION_MINOR "${Demo_VERSION_MINOR}")
include (CPack)

上面的代碼做了以下幾個工作:

導入 InstallRequiredSystemLibraries 模塊,以便之後導入 CPack 模塊;設置一些 CPack 相關變量,包括版權資訊和版本信息,其中版本信息用了上一節定義的版本號;

接下來的工作是像往常一樣構建工程,並執行 cpack 命令。

cpack -C CPackConfig.cmake

cpack -C CPackSourceConfig.cmake

我們可以試一下。在生成項目後,執行 cpack -C CPackConfig.cmake 命令:

[ehome@xman Demo8]$ cpack -C CPackSourceConfig.cmake
CPack: Create package using STGZ
CPack: Install projects
CPack: - Run preinstall target for: Demo8
CPack: - Install project: Demo8
CPack: Create package
CPack: - package: /home/ehome/Documents/programming/C/power/Demo8/Demo8-1.0.1-Linux.sh generated.
CPack: Create package using TGZ
CPack: Install projects
CPack: - Run preinstall target for: Demo8
CPack: - Install project: Demo8
CPack: Create package
CPack: - package: /home/ehome/Documents/programming/C/power/Demo8/Demo8-1.0.1-Linux.tar.gz generated.
CPack: Create package using TZ
CPack: Install projects
CPack: - Run preinstall target for: Demo8
CPack: - Install project: Demo8
CPack: Create package
CPack: - package: /home/ehome/Documents/programming/C/power/Demo8/Demo8-1.0.1-Linux.tar.Z generated.

此時會在該目錄下創建 3 個不同格式的二進位包文件:

[ehome@xman Demo8]$ ls Demo8-*
Demo8-1.0.1-Linux.sh  Demo8-1.0.1-Linux.tar.gz  Demo8-1.0.1-Linux.tar.Z

這 3 個二進位包文件所包含的內容是完全相同的。我們可以執行其中一個。此時會出現一個由 CPack 自動生成的交互式安裝界面:

[ehome@xman Demo8]$ sh Demo8-1.0.1-Linux.sh 
Demo8 Installer Version: 1.0.1, Copyright (c) Humanity
This is a self-extracting archive.
The archive will be extracted to: /home/ehome/Documents/programming/C/power/Demo8

If you want to stop extracting, please press <ctrl-C>.
The MIT License (MIT)

Copyright (c) 2013 Joseph Pan(http://hahack.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


Do you accept the license? [yN]: 
y
By default the Demo8 will be installed in:
  "/home/ehome/Documents/programming/C/power/Demo8/Demo8-1.0.1-Linux"
Do you want to include the subdirectory Demo8-1.0.1-Linux?
Saying no will install in: "/home/ehome/Documents/programming/C/power/Demo8" [Yn]: 
y

Using target directory: /home/ehome/Documents/programming/C/power/Demo8/Demo8-1.0.1-Linux
Extracting, please wait...

Unpacking finished successfully

完成後提示安裝到了 Demo8-1.0.1-Linux 子目錄中,我們可以進去執行該程序:

[ehome@xman Demo8]$ ./Demo8-1.0.1-Linux/bin/Demo 5 2
Now we use our own Math library. 
5 ^ 2 is 25

關於 CPack 的更詳細的用法可以通過 man 1 cpack 參考 CPack 的文檔。

項目遷移

CMake 可以很輕鬆地構建出在適合各個平臺執行的工程環境。而如果當前的工程環境不是 CMake ,而是基於某個特定的平臺,是否可以遷移到 CMake 呢?答案是可能的。下面針對幾個常用的平臺,列出了它們對應的遷移方案。

autotoolsam2cmake 可以將 autotools 系的項目轉換到 CMake,這個工具的一個成功案例是 KDE 。Alternative Automake2CMake 可以轉換使用 automake 的 KDevelop 工程項目。Converting autoconf testsqmakeqmake converter 可以轉換使用 QT 的 qmake 的工程。Visual Studiovcproj2cmake.rb 可以根據 Visual Studio 的工程文件(後綴名是 .vcproj 或 .vcxproj)生成 CMakeLists.txt 文件。vcproj2cmake.ps1 vcproj2cmake 的 PowerShell 版本。folders4cmake 根據 Visual Studio 項目文件生成相應的 「source_group」 信息,這些信息可以很方便的在 CMake 腳本中使用。支持 Visual Studio 9/10 工程文件。CMakeLists.txt 自動推導gencmake 根據現有文件推導 CMakeLists.txt 文件。CMakeListGenerator 應用一套文件和目錄分析創建出完整的 CMakeLists.txt 文件。僅支持 Win32 平臺。相關連結官方主頁:https://github.com/wzpan/cmake-demo/tree/master/Demo1官方文檔:http://www.cmake.org/cmake/help/cmake2.4docs.html官方教程:http://www.cmake.org/cmake/help/cmake_tutorial.html類似工具SCons:Eric S. Raymond、Timothee Besset、Zed A. Shaw 等大神力薦的項目架構工具。和 CMake 的最大區別是使用 Python 作為執行腳本。溫馨提示

由於微信公眾號近期改變了推送規則,如果您想經常看到我們的文章,可以在每次閱讀後,在頁面下方點一個「贊」或「在看」,這樣每次推送的文章才會第一時間出現在您的訂閱列表裡。

版權聲明:本文來源網絡,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯繫我進行刪除。

猜你喜歡:

實用 | 一個高性能通信庫的簡單使用分享

初學者福利,這裡有一款很好上手的GUI

不按套路出牌,這麼來寫IIC驅動?

乾貨 | C語言實現面向對象編程(附代碼)

2020年精選原創筆記匯總

在公眾號聊天界面回復1024,可獲取嵌入式資源;回復 m ,可查看文章匯總。

文章都看完了不點個嗎

相關焦點

  • 實用 | 使用Cmake快速生成visual studio工程
    安裝完成之後按Win+r進入運行窗口,輸入cmd後按回車來到命令行,輸入cmake -version命令核實是否安裝成功,出現如下界面說明已經安裝成功:關於CMake、CMakeLists.txt 的乾貨文章可見:分享一篇很不錯的CMake入門文章,值得收藏細讀!五、資源下載 CMake工具安裝文件可在本公眾號後臺回復關鍵詞:CMake安裝,即可獲取。
  • CMAKE入門實戰
    0.導語最近做的項目使用CLION構建,而這個採用CMakeLists.txt管理,因此為了更好的學習,故找到了一篇大牛級別的入門文章,有文章有代碼
  • 一篇文章看懂各式廚刀入門如何選(推薦收藏)
    十八子作G2001-A鋼刃斬切刀十八子作G2001-A鋼刃斬切刀...索尼還沒破產嗎|贊14評論16收藏47查看詳情手工刀要認準好鐵匠,還必須會磨刀和保養。做手工不鏽鋼刀口碑不錯的有樂山非物質文化遺產的李菜刀。
  • 【經驗分享】win10 cmake 構建 Tengine 工程
    前面寫過一篇《【經驗分享】win10 qmake 構建 ncnn vs 工程》,介紹了在 win10 上使用 nmake 和 qmake 構建 ncnn vs 工程的方法,這裡用 cmake 來走一遍 Tengine vs 工程的構建。
  • CMake入門
    mkdir build && cd buildcmake ..makemake install在這個例子中,我們建了一個 build 文件夾用於執行 cmake 指令,這種做法叫做外部編譯(out-of-source-build)。注意 cmake .. 這後邊有個 .. 這是用於告訴 CMAKE CMakeLists.txt 在哪個文件夾下。
  • Cmake 入門簡介
    二、 CMake下載安裝下載地址 https://cmake.org/download/window版直接點擊「下一步」安裝完成效果三 CMake基本使用和語法1、 commandcommand (args …)command 是命令名,大小寫無關(注意:變量是大小寫相關的)args 是參數,參數如果有空格,
  • 乾貨|一篇文章入門Oracle注入 建議收藏
    oracle基礎學習寫在前頭,本文是我在學習Oracle注入時做的筆記加以整理所作的分享,由於在面試中被問過幾次,並不是很難的東西,總是被問住,
  • CMake實戰教程(二)
    前言從上一篇的文章中,相信大家也了解了CMake這個東西,但是呢它不是只是看一下就能會的,這種東西還是要實踐才能學會,那麼如果你已經實踐過了,就會體會到上一篇文章在實際中使用到底是多麼的難搞,比如:總的來說就是在真正項目中壓根就沒法適用的工程,那為什麼我要寫呢,因為那是我學習的過程,總不能一口吞下一個大胖子是不是,接下來的一系列文章我就會讓CMake變得能在實際中使用,
  • 【CMake教程】(五)CMake 配置install打包
    本片教程我們將講述如何在cmake中配置install的打包路徑。下面我們將以mathlib庫和頭文件為例子進行配置。(2)CMake 的使用環境和安裝本教程的使用環境為:ubutu18.04 ltsgcc version 7.5.0g++ version 7.5.0cmake version 3.10.2安裝cmake:sudo apt install cmake(3)設置設置我們的程序輸出為lib文件
  • Ubuntu 18.04下安裝最新CMake及CMake簡單使用
    cmake所做的事其實就是告訴編譯器如何去編譯連結原始碼。你也許想問不是有makefile嗎,為什麼還要它?這裡就牽涉到跨平臺問題。在Windows平臺下是通過project文件去管理這些的,如果不用cmake,那我們為Windows和Linux系統就要寫對應的project文件和makefile文件,這無疑是一件繁瑣的事,而我們只要編寫一次cmake,就可以用在各個平臺,而且其語法也簡單。
  • 【CMake教程】(三)CMake 配置指定C++11編譯的標準
    (2)CMake 的使用環境和安裝本教程的使用環境為:ubutu18.04 ltsgcc version 7.5.0g++ version 7.5.0cmake version 3.10.2安裝cmake:sudo apt install cmake(3)CMake指定C++標準  指定C+
  • 學術寫作|孫萍:如何寫一篇還不錯的學術文章
    華麗的文章千篇一律有靈魂的論文萬裡挑一有靈魂的論文總是直擊問題進而發現問題、探索問題、解決問題本期「研·成長」系列講座特邀孫萍老師開展「如何寫一篇還不錯的學術文章」講座給小院的碩博小果子們「施施肥」本期孫老師的講座主題明確、幽默風趣,一針見血如何運用理論寫作
  • CMake使用入門
    例子cmake_minimum_required(VERSION 3.13)project(HelloWorld)add_library(hello_world STATIC
  • CMake實戰教程(三)
    從上一篇文章我們就知道,通過aux_source_directory命令可以掃描某個目錄下的所有源碼,但是更深一層的目錄源碼就找不到了,因此不滿足我們真正工程項目的需要,畢竟真的工程會有很多個目錄的,這些目錄在的地方還不一樣,現在就來解決這個問題…定個小目標實現首先,起碼工程中得有多個目錄對吧,按照編程習慣,我喜歡把源碼放到 src 目錄下,把頭文件放到 inc 目錄下,
  • 跨平臺開發編譯必備——CMake入門指南
    << std::endl; return 0;}CMakeLists.txt123456789cmake_minimum_required(VERSION 3.8) project(CmakeHelloWorld)
  • CMake,大型項目採用的構建工具
    本篇文章主要描述CMake的基本用法。在之前的文件中我對Makefile,Autotools這兩個構建工具。相關文章如下:之前對這兩個工具進行了描述,其中autotools最終的目的為了實現Makefile。在上一篇文章中我們介紹了autotools工具的時候說到,他是為了解決Makefile複雜的語法結構的問題。使其更加方便。
  • CMake 教你如何連結共享庫
    在之前作者已經整理了兩篇相關文章,如下:今天的文章是基於上一篇的文章的寫到的工程繼續擴展的,如果對CMake製作動態庫和靜態庫不是很了解的小夥伴,建議先看一下上一篇文章的描述。《動態庫連結》在上一節中我們製作了一個librice.so的動態庫,並進行了安裝,所以我們直接使用這個動態庫。
  • ittbank歷史文章集錦(值得收藏)
    ittbank歷史文章集錦,回複數字1--125,可以得到相應的文章!1.小米系列手機所用液晶屏揭秘2.小米手機3S、紅米2代齊曝光:會配備5.5寸屏手機行業3.什麼是水貨、港版、港行、行貨以及它們的區別4.高通,聯發科(MTK),展訊手機平臺處理器參數對比一覽表5.小米系列手機所用主控晶片曝光6.展訊智慧型手機晶片參數對比一覽表(值得收藏
  • 分享下CMake和QT開發環境的一個小知識
    這個時候我們需要用cmake-gui去構建makefile。第一步:點擊configure:第二步:添加變量QT5_DIR的目錄,具體根據自己的需要去勾選變量和設置變量的值:小編也嘗試用命令行的方式去構建項目,發現cmake不能定位到QT的目錄,具體原因不是很清楚,用cmake-gui的方式就可以達到目的。
  • 印象筆記:2020年度最具收藏價值公眾號Top50丨重磅發布
    今天,印象筆記重磅發布了2020年度最具收藏價值公眾號Top 50的榜單。 根據每位讀者收藏的數據,最終「劉潤」公眾號成為【科技財經榜】第三名。 感謝每一位讀者的喜歡。2021年,繼續加油。藉此機會,我也把2020年,咱們「劉潤」公眾號收藏最高的前5篇文章,作為2021年的元旦禮物,整理好分享給你,祝你元旦快樂,2021加油。01、《 疫情後,這項能力為什麼如此重要?》02、《我14年的面試經驗,都在這裡了》03、《獨家揭秘董明珠直播:可能只有董明珠,找到了直播帶貨的本質。》