CMake 自定義編譯選項


自定義編譯選項

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})

 

其中:

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

 

修改 main.cc 文件

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

#include 
#include 
#include 
"config.h"
#ifdef USE_MYMATH
  #include "math/MathFunctions.h"
#else
  #include 
#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]);// Convert string to float
    int exponent = atoi(argv[2]); // Convert string to integer
    
#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 文件

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

#cmakedefine USE_MYMATH

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

參考文檔http://www.cmake.org/cmake-tutorial/

這里有更加完整的中文版,感謝大神!!:

http://www.cnblogs.com/coderfenghc/archive/2013/01/20/2846621.html#3176055


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM