自定義編譯選項
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})
其中:
configure_file命令用於加入一個配置頭文件 config.h ,這個文件由 CMake 從 config.h.in 生成,通過這樣的機制,將可以通過預定義一些參數和變量來控制代碼的生成。option命令添加了一個USE_MYMATH選項,並且默認值為ON。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
