cmake_minimum_required(VERSION 3.9)
project(LevealDBTry)
#設定編譯參數
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE "Debug")
#設定源碼清單.cpp
set(SOURCE_FILES ./main.cc)
#設定所有源碼清單 :aux_source_directory(<dir> <variable>)
#比如:aux_source_directory(${CMAKE_SOURCE_DIR} DIR) 将${CMAKE_SOURCE_DIR}目錄下,也就是最頂級目錄下所有的.cpp檔案放入DIR變量中,後面的add_executable就可以很簡化
# add_executable(hello_world ${DIR})
#設定頭檔案路徑
include_directories(../include/)
#include_directories("路徑1" “路徑2”...)
#設定連結庫的路徑(一般使用第三方非系統目錄下的庫)
link_directories(../build/)
#link_directories("路徑1" “路徑2”...)
#添加子目錄,作用相當于進入子目錄裡面,展開子目錄的CMakeLists.txt
#同時執行,子目錄中的CMakeLists.txt一般是編譯成一個庫,作為一個子產品
#在父目錄中可以直接引用子目錄生成的庫
#add_subdirectory(math)
#生成動/靜态庫
#add_library(動/靜态連結庫名稱 SHARED/STATIC(可選,預設STATIC) 源碼清單)
#可以單獨生成多個子產品
#生成可執行檔案
add_executable(myLevealDB ${SOURCE_FILES} )
#比如:add_executable(hello_world ${SOURCE_FILES})
target_link_libraries(myLevealDB pthred glog)#就是g++ 編譯選項中-l後的内容,不要有多餘空格
ADD_CUSTOM_COMMAND( #執行shell指令
TARGET myLevelDB
POST_BUILD #在目标檔案myLevelDBbuild之後,執行下面的拷貝指令,還可以選擇PRE_BUILD指令将會在其他依賴項執行前執行 PRE_LINK指令将會在其他依賴項執行完後執行 POST_BUILD指令将會在目标建構完後執行。
COMMAND cp ./myLevelDB ../
)
cmake 常用變量
1,CMAKE_BINARY_DIR PROJECT_BINARY_DIR _BINARY_DIR
這三個變量指代的内容是一緻的,如果是in source 編譯,指得就是工程頂層目錄,如果是out-of-source 編譯,指的是工程編譯發生的目錄。PROJECT_BINARY_DIR 跟其他指令稍有差別,現在,你可以了解為他們是一緻的。
2,CMAKE_SOURCE_DIR PROJECT_SOURCE_DIR _SOURCE_DIR
這三個變量指代的内容是一緻的,不論采用何種編譯方式,都是工程頂層目錄。
也就是在in source 編譯時,他跟CMAKE_BINARY_DIR 等變量一緻。PROJECT_SOURCE_DIR 跟其他指令稍有差別,現在,你可以了解為他們是一緻的。
3,CMAKE_CURRENT_SOURCE_DIR 指的是目前處理的CMakeLists.txt 所在的路徑,比如上面我們提到的src子目錄。
4,CMAKE_CURRRENT_BINARY_DIR
如果是in-source 編譯,它跟CMAKE_CURRENT_SOURCE_DIR 一緻,如果是out-of-source 編譯,他指的是target 編譯目錄。使用我們上面提到的ADD_SUBDIRECTORY(src bin) 可以更改這個變量的值。使用SET(EXECUTABLE_OUTPUT_PATH < 新路徑>)并不會對這個變量造成影響,它僅僅
修改了最終目标檔案存放的路徑。
5,CMAKE_CURRENT_LIST_FILE 輸出調用這個變量的CMakeLists.txt 的完整路徑
6,CMAKE_CURRENT_LIST_LINE 輸出這個變量所在的行
7,CMAKE_MODULE_PATH
這個變量用來定義自己的cmake 子產品所在的路徑。如果你的工程比較複雜,有可能會自己編寫一些cmake 子產品,這些cmake 子產品是随你的工程釋出的,為了讓cmake 在處理CMakeLists.txt 時找到這些子產品,你需要通過SET指令,将自己的cmake 子產品路徑設定一下。
比如
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) 這時候你就可以通過INCLUDE 指令來調用自己的子產品了。
8,EXECUTABLE_OUTPUT_PATH 和LIBRARY_OUTPUT_PATH 分别用來重新定義最終結果的存放目錄,前面我們已經提到了這兩個變量。
9,PROJECT_NAME 傳回通過PROJECT 指令定義的項目名稱。
cmake添加宏定義
CMakeLists.txt檔案:
cmake_minimum_required(VERSION 3.9)
project(myProject)
IF(GPU)
#在指令行中使用cmake -DGPU,會進入這一行,C++代碼中自動會有#define GPU
ADD_DEFINITIONS(-DGPU) #注意一定要有-D
ENDIF(GPU)
add_executable(a.out testCmake.cc)
testCmake.cc檔案:
#include <iostream>
using namespace std;
int main(){
#ifdef GPU
cout<<"GPU"<<endl;//定義了GPU輸出這一行
#else
cout<<"CPU"<<endl;//沒有定義輸出這一行
#endif
cout<<"hello world"<<endl;//無論定義與否都會執行
return 0;
}
執行CMake的指令:
mkdir build
cd build
cmake -DGPU=on ..
注意:一定是在GPU指令前加上D,不然無法識别