預(yù)定義變量的使用
測試目錄如下:
可以看到只有兩個源文件hello.c杨赤,test.c哟楷,cd到build目錄執(zhí)行cmake
cmake_minimum_required(VERSION 3.4.1)
project(hello)
message(STATUS "PROJECT_NAME:" ${PROJECT_NAME}) # project函數(shù)里面的值
message(STATUS "CMAKE_MAJOR_VERSION:" ${CMAKE_MAJOR_VERSION}) #cmake主版本號
message(STATUS "CMAKE_MINOR_VERSION:" ${CMAKE_MINOR_VERSION}) #cmake次版本號
message(STATUS "CMAKE_PATCH_VERSION:" ${CMAKE_PATCH_VERSION}) #cmake補丁版本號
message(STATUS "CMAKE_HOST_SYSTEM:" ${CMAKE_HOST_SYSTEM}) #系統(tǒng)
message(STATUS "CMAKE_HOST_SYSTEM_NAME:" ${CMAKE_HOST_SYSTEM_NAME}) #系統(tǒng)名稱
message(STATUS "CMAKE_HOST_SYSTEM_VERSION:" ${CMAKE_HOST_SYSTEM_VERSION}) #系統(tǒng)版本
message(STATUS "CMAKE_HOST_SYSTEM_PROCESSOR:" ${CMAKE_HOST_SYSTEM_PROCESSOR}) #處理器類型
message(STATUS "PROJECT_SOURCE_DIR:" ${PROJECT_SOURCE_DIR}) #cmake命令后緊跟的目錄,一般是工程的根目錄
message(STATUS "PROJECT_BINARY_DIR:" ${PROJECT_BINARY_DIR}) #cmake命令執(zhí)行的目錄
message(STATUS "hello_SOURCE_DIR:" ${hello_SOURCE_DIR}) #cmake命令后緊跟的目錄皆辽,一般是工程的根目錄
message(STATUS "hello_BINARY_DIR:" ${hello_BINARY_DIR}) #cmake命令執(zhí)行的目錄
message(STATUS "CMAKE_CURRENT_SOURCE_DIR:" ${CMAKE_CURRENT_SOURCE_DIR}) #當(dāng)前處理的CMakeLists.txt 所在的路徑
message(STATUS "CMAKE_CURRENT_LIST_FILE:" ${CMAKE_CURRENT_LIST_FILE}) #使用這個變量的CMakeLists.txt路徑
message(STATUS "CMAKE_CURRENT_LIST_LINE:" ${CMAKE_CURRENT_LIST_LINE}) #當(dāng)前變量在CMakeLists.txt文件中的行號
message(STATUS "UNIX:" ${UNIX})
message(STATUS "WIN32:" ${WIN32})
add_subdirectory(test)
include_directories(test)
add_executable(main ${SRC_LIST})
target_link_libraries(main t)
執(zhí)行結(jié)果:
系統(tǒng)環(huán)境變量
SET(ENV{CMAKE_INCLUDE_PATH} "hhhh") #設(shè)置系統(tǒng)環(huán)境變量
message(STATUS "CMAKE_INCLUDE_PATH:" $ENV{CMAKE_INCLUDE_PATH}) #系統(tǒng)環(huán)境變量,使用ENV前綴
也可以通過以下方式設(shè)置:
搜索所有的源文件
aux_source_directory(. SRC_LIST) //當(dāng)前目錄查找,賦值給變量SRC_LIST
file(GLOB SRC_LIST1 "*.c")
file(GLOB SRC_LIST2 "*.c" "test/*.c") //file方式查找當(dāng)前目錄文捶,test目錄
file(GLOB SRC_LIST3 RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.c") //輸出相對于指定路徑的結(jié)果
message(STATUS "SRC_LIST:" ${SRC_LIST})
message(STATUS "SRC_LIST1:" ${SRC_LIST1})
message(STATUS "SRC_LIST2:" ${SRC_LIST2})
message(STATUS "SRC_LIST3:" ${SRC_LIST3})
可以看到SRC_LIST1,SRC_LIST2都是絕對路徑媒咳,SRC_LIST粹排,SRC_LIST3是相對路徑
設(shè)置包含的目錄
一般作用是把頭文件放到搜索路徑下:
include_directories(test)
hello.c里面頭文件路徑不用修改:
#include <stdio.h>
#include "test.h" //這里就不用絕對路徑了
int main()
{
printf("PI:%f\n",PI);
printf("hello world:%d\n",add(1,5));
return 0;
}
設(shè)置 target 需要鏈接的庫
add_subdirectory(test) // test目錄單獨生成庫文件
include_directories(test)
add_executable(main ${SRC_LIST})
target_link_libraries(main t) // 這里可以查找到libt.so
配置文件
配置一個頭文件將一些 CMake 設(shè)置傳入到源代碼中,例如這里定義一個是否Debug的開關(guān)
option (DEBUG "debuggable" ON) //這個變量定義一定寫在前面
configure_file("${PROJECT_SOURCE_DIR}/config.h.in" "${PROJECT_BINARY_DIR}/config.h") //以 config.h.in 為模版涩澡,替換相關(guān)變量以生成 config.h
在指定目錄新建一個文件config.h.in顽耳,這里文件名可以是其他的,最好有意義
#cmakedefine DEBUG //這里使用#cmakedefine
執(zhí)行cmake .. 妙同,在build目錄產(chǎn)生了config.h
內(nèi)容如下:
#define DEBUG
可以在CMakeLists.txt中使用這個定義射富,也可以在源文件中使用:
option (DEBUG "debuggable" ON)
configure_file("${PROJECT_SOURCE_DIR}/config.h.in" "${PROJECT_BINARY_DIR}/config.h")
if(DEBUG)
message(STATUS "DEBUG:" ${DEBUG})
endif(DEBUG)
執(zhí)行如下:
在源文件中使用:
#include <stdio.h>
#include "test.h"
#include "build/config.h" //引入頭文件
int main()
{
printf("PI:%f\n",PI);
printf("hello world:%d\n",add(1,5));
#ifdef DEBUG
printf("debug:%d\n",1); //打印輸出
#endif
return 0;
}
執(zhí)行結(jié)果如下:
設(shè)置編譯類型
add_executable(demo demo.cpp) # 生成可執(zhí)行文件
add_library(common STATIC util.cpp) # 生成靜態(tài)庫
add_library(common SHARED util.cpp) # 生成動態(tài)庫或共享庫
使用shell腳本
新建一個make.sh
#!/bin/bash
cd build
rm -rf *
cmake ..
make
./main
添加可執(zhí)行權(quán)限:chmod u+x make.sh
執(zhí)行結(jié)果: