当工程规模比较大复杂时,手写Makefile十分不便,要是能自动生成Makefile,那该多好。cmake就这样诞生了,cmake是一个跨平台的自动化构建系统,它使用名为CMakeLists.txt来管理Makefile文件。不过从易用性方面而言,比qmake还是逊色多了。
一. 安装
下载源码,运行 ./bootstrap, make, make install 即可
二. 工程处理
2.1 动态库
#生成动态库libadd.so PROJECT(add) #工程名称 CMAKE_MINIMUM_REQUIRED(VERSION 2.8) #cmake最低版本限制 AUX_SOURCE_DIRECTORY(. DIR_SRCS1) #将当前目录赋给变量DIR_SRC1 ADD_LIBRARY(add SHARED ${DIR_SRCS1}) #编译${DIR_SRCS1}文件,生成动态库libadd.so SET(CMAKE_BUILD_TYPE Debug) #设置工程为Debug版本,或者直接运行 cmake -DCMAKE_BUILD_TYPE=Debug(或Release) SET_TARGET_PROPERTIES(add PROPERTIES VERSION 1.0 SOVERSION 1) #设置动态库版本号 MESSAGE(STATUS "finish compiler libadd") #打印信息 在当前目录直接运行 cmake,会生成 Makefile
2.2 app工程
PROJECT(depend) CMAKE_MINIMUM_REQUIRED(VERSION 2.8) ADD_SUBDIRECTORY(src) #添加子目录 AUX_SOURCE_DIRECTORY(. DIR_SRCS) ADD_EXECUTABLE(depend ${DIR_SRCS}) #生成可执行文件depend INCLUDE_DIRECTORIES( src #include文件目录 ) ADD_DEFINITIONS( -DHELLO #预编译宏定义开关 -DWORLD ) SET(CMAKE_BUILD_TYPE Debug) SET(CMAKE_VERBOSE_MAKEFILE on) #默认情况下,不会打印make执行过程,on启用即可 SET(EXECUTABLE_OUTPUT_PATH ./bin) TARGET_LINK_LIBRARIES(depend add) #添加依赖库libadd.so #for 语句 SET(VAR a b c) FOREACH(f ${VAR}) MESSAGE("print " ${f}) ENDFOREACH(f) #if 语句 SET(AAA abc) IF(AAA STREQUAL abc) MESSAGE(STATUS "TRUE") ENDIF() #os 判断 IF(UNIX) MESSAGE("OS: Linux") ENDIF() #自定义命令 SET(CUSTOM_TARGET depend-1) add_custom_command( PRE_BUILD COMMAND echo "execute a fake cmd" COMMENT "This cmd will be execute before building" OUTPUT ${CUSTOM_TARGET} COMMAND cp test.txt bin/${CUSTOM_TARGET} DEPENDS test.txt ) ADD_CUSTOM_TARGET(whatever DEPENDS ${CUSTOM_TARGET}) #make whatever,会拷贝test.txt文件到bin/