CMake 容許爲項目增長編譯選項,從而能夠根據用戶的環境和需求選擇最合適的編譯方案。html
例如,能夠將 MathFunctions 庫設爲一個可選庫,若是該選項爲 ON
,就使用該庫定義的數學函數來進行運算。不然就調用標準庫中的數學函數庫。ide
咱們要作的第一步是在頂層的 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})
其中:ui
configure_file
命令用於加入一個配置頭文件 config.h ,這個文件由 CMake 從 config.h.in 生成,經過這樣的機制,將能夠經過預約義一些參數和變量來控制代碼的生成。option
命令添加了一個 USE_MYMATH
選項,而且默認值爲 ON
。USE_MYMATH
變量的值決定是否使用咱們本身編寫的 MathFunctions 庫。
以後修改 main.cc 文件,讓其根據 USE_MYMATH
的預約義值來決定是否調用標準庫仍是 MathFunctions 庫:spa
#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 文件,這個文件預約義了 USE_MYMATH
的值。但咱們並不直接編寫這個文件,爲了方便從 CMakeLists.txt 中導入配置,咱們編寫一個 config.h.in 文件,內容以下:code
#cmakedefine USE_MYMATH
這樣 CMake 會自動根據 CMakeLists 配置文件中的設置自動生成 config.h 文件。htm
參考文檔:http://www.cmake.org/cmake-tutorial/blog
這裏有更加完整的中文版,感謝大神!!:文檔
http://www.cnblogs.com/coderfenghc/archive/2013/01/20/2846621.html#3176055get