CMake编译原理
CMake是一种跨平台编译工具,主要编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库.因此CMake的编译基本就两个步骤:cmake && make
cmake 指向的是CMakeLists.txt所在的目录,cmake会生成很多编译中间文件和makefile文件. 我们一般在使用中. 会用out-of-source方式构建,新建一个文件夹, 文件夹名字随意, 习惯命名为build; 依次执行以下命令
cd build
cmake .. (表示CMakeLists.txt在当前目录的上一级目录中)
make
常见命令
#1.cmake verson,指定cmake版本,可选项
cmake_minimum_required(VERSION 2.8)
#2.project name,指定项目的名称,可选项, 一般和项目的文件夹名称对应
PROJECT(demo)
#3.提供ON和OFF选项, 若没有初始值, 则使用OFF
OPTION (ENABLE_UNITTEST "Unit Test" OFF)
#4.message 显示一条消息. STATUS=非重要信息;WARNING=CMake 警告,会继续执行;*AUTHO*R_WARNING = CMake 警告 (dev), 会继续执行;*SEND*_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;*FATAL*_ERROR = CMake 错误, 终止所有处理过程;在 stdout 上显示 STATUS 消息,在 stderr 上显示其他所有消息
MESSAGE(STATUS ENABLE_UNITTEST=${ENABLE_UNITTEST})
IF(ENABLE_UNITTEST)
#启用测试;
ENABLE_TESTING()
ENDIF()
#5 .设置 C++ 编译选项,也可以通过指令 add_definitions() 添加,add_definitions(-DENABLE_DEBUG -DABC) # 参数之间用空格分隔
SET(CMAKE_CXX_FLAGS "-fPIC -Wall -Wno-deprecated -std=c++11")
#6.添加子工程
SET(CommonDir ${CMAKE_CURRENT_SOURCE_DIR}/common)
ADD_SUBDIRECTORY(${CommonDir} common.out)
#7.头文件目录
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
#8.将指定路径下所有的源代码文件存储在一个变量中;
AUX_SOURCE_DIRECTORY(. SRC_LIST) #将当前CMakeLists.txt目录下所有.cpp文件保存到SRC_LIST变量中
#9.GLOB为所有匹配表达式的文件生成一个文件list. 并将该list存储进变量variable. 如*.proto匹配所有扩展名为proto的文件
FILE(GLOB FILE_PROTOS "*.proto")
#10.foreach循环FILE_PROTOS列表中的每一项. FIL存放每一轮循环时列表中该项的值;
FOREACH(FIL ${FILE_PROTOS})
#10.1ABS_FIL 保存获取部分的变量; 获取文件绝对路径
GET_FILENAME_COMPONENT(ABS_FIL ${FIL} ABSOLUTE)
#10.2获取文件父路径
GET_FILENAME_COMPONENT(FIL_WE ${FIL} NAME_WE)
#10.3添加新element到list中
LIST(APPEND PROTO_SRCS "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc")
#10.4执行多个子进程
EXECUTE_PROCESS(
)
ENDFOREACH()
#11.生成可执行文件
ADD_EXECUTABLE(${PROJECT_NAME} demo.cpp) #生成可执行文件: demo
#12.生成静态库/共享库
ADD_LIBRARY(test STATIC test.cpp) #静态库 libtest.a
ADD_LIBRARY(test SHARED test.cpp) #动态库/共享库 libtest.so
#13.add link library,添加可执行文件所需要的库,比如我们用到了libmt.so(命名规则:lib+name+.so),就添加该库的名称
TARGET_LINK_LIBRARIES(${PROJECT_NAME} mt)
一个小demo