一、cmake干什么用的
cmake是一款项目构建工具,它不生成最终的程序,而是生成makefile或者其他平台的编译文件。
- TIPS
- CMAKE不区分window和linux两种不同路径的写法
二、 常用语法
- CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
2.项目名称 版本号设置
project (Demo2 VERSION 1.0)
3.查找当前目录下的所有源文件并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
4.指定生成目标
add_executable(Demo ${DIR_SRCS})
5.设置c++版本标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
6.设置使用何种策略
cmake_policy(SET CMP0025 NEW)
7.定义自己的cmake模块在何路径
SET(CMAKE_MODULE_PATH {CMAKE_CURRENT_SOURCE_DIR}/CMakeModules)
8.版本号设置 major (主版本号码)minor(次版本号)patch(补丁)
set(LIB_MAJOR_VERSION "1")
set(LIB_MINOR_VERSION "1")
set(LIB_PATCH_VERSION "0")
9.设置可选项
设置了可选项后,可以在cmake中定义不同的宏,然后在源代码中判断
option(TEST_DEBUG "option for debug" OFF)
if(TEST_DEBUG)
add_definitions(-DTEST_DEBUG)
endif()
c++源代码中可以进行宏判断
#ifdef TEST_DEBUG
fun()
#endif
10.编译器供应上
messag(${CMAKE_CXX_COMPILER_ID})
以上语句在windows中输出MSVC
在centos6.5中输出GNU
11.判断编译平台
IF(UNIX OR CYGWIN)
SET(_CMAKE_INSTALL_DIR "${LIB_INSTALL_DIR}/cmake/${PROJECT_NAME}")
ELSEIF(WIN32)
SET(_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/cmake")
ENDIF()
12.find_package() 引入外部依赖包
Cmake之深入理解find_package()的用法
find_package(CURL)
add_executable(curltest curltest.cc)
if(CURL_FOUND)
target_include_directories(clib PRIVATE ${CURL_INCLUDE_DIR}) target_link_libraries(curltest ${CURL_LIBRARY})
else(CURL_FOUND)
message(FATAL_ERROR ”CURL library not found”)
endif(CURL_FOUND)
- add_custom_target 添加不在ALL中的target
《CMake之add_custom_target》
三、 .cmake文件作用
cmake可以被include,以达到复用其中函数的作用
3.1 CMake的几种Include
《对于target_include_directories的private,public,interface详细的解释》
3.2 CMAKE_BUILD_TYPE的几种取值
CMAKE_C_FLAGS_DEBUG is -g
CMAKE_C_FLAGS_RELEASE is -O3 -DNDEBUG
CMAKE_C_FLAGS_RELWITHDEBINFO is -O2 -g -DNDEBUG
CMAKE_C_FLAGS_MINSIZEREL is -Os -DNDEBUG
CMAKE_CXX_FLAGS_DEBUG is -g
CMAKE_CXX_FLAGS_RELEASE is -O3 -DNDEBUG
CMAKE_CXX_FLAGS_RELWITHDEBINFO is -O2 -g -DNDEBUG
CMAKE_CXX_FLAGS_MINSIZEREL is -Os -DNDEBUG
Using cmake, how do you determine the default compiler flags per build type? - Stack Overflow