CMake使用用例

使用CMake的最低版本为2.8.4

cmake_minimum_required(VERSION 2.8.4)

指定工程名称为”sample”

project(sample)

使用find_package来查找已经安装到系统中的库

# Boost
find_package(Boost 1.54 REQUIRED regex program_options date_time filesystem system thread)
 
# OpenSSL
find_package(OpenSSL REQUIRED)
 
# Google Protobuf
find_package(Protobuf REQUIRED)

添加C++的编译参数

add_definitions(-std=c++11)

设置编译参数(DEBUG)

set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -DDEBUG")

./src/*.cpp文件添加到编译列表

file(GLOB SRC "./src/*.cpp")
add_executable(sample ${SRC})

链接额外的库文件(Boost_LIBRARIES是Boost.cmake中预定义的宏,也就是文件最头定义的那些boost文件)。同时,以下的makefile脚本也将链接OpenSSL的库,以及protobuf和mysqlcppconn两个库。

target_link_libraries(sample ${Boost_LIBRARIES} ${OPENSSL_LIBRARIES} protobuf mysqlcppconn)

安装目标文件到[prefix]/bin/目录下,默认的prefix目录是/usr/local/,所以,以下的makefile脚本将会把sample工程的可执行文件安装到/usr/local/bin/目录下。

install(TARGETS sample DESTINATION bin)

以下为安装可执行脚本到[prefix]/sbin/目录下。与TARGETS唯一不同的地方是,安装完成后将会把对应的文件加上可执行属性。

install(PROGRAMS ./hello.sh DESTINATION sbin)

以下为安装文件,并且会在安装文件前先判断该是否存在,若存在则不安装该文件。

file(GLOB config_file “${CMAKE_INSTALL_PREFIX}}/etc/ume/ume-sc.conf")
if(NOT EXISTS ${config_file})
  install(FILES "./ume-sc.conf" DESTINATION etc/ume)
endif()

变量的基本操作

# 定义一个变量
set(variable_name 100)
 
# 取消一个变量的定义
unset(variable_name)
 
# 判断一个变量是否定义
if (DEFINED variable_name)

在指定的目录中查找某个库并链接

find_library(JSONCPP_LIB jsoncpp /opt/local/lib)
target_link_libraries(sample ${JSONCPP_LIB})

在某TARGET完成编译后执行命令,通常可以用来执行测试用例

add_custom_command(TARGET [target_name] POST_BUILD COMMAND [command])

添加指定的生成命令,例如,在编译某工程时使用到了protobuf编译器生成的源文件,于是需要在这里添加该源文件的生成说明,然后当编译需要使用到该文件时将会自动调用该生成步骤将源文件生成出来。注:CMAKE_CURRENT_BINARY_DIR为当前CMake编译目录。

add_custom_command(
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/file.cpp
  COMMAND protoc file.proto --cpp_out=${CMAKE_CURRENT_BINARY_DIR}/
  COMMENT "Generating file.c..."
)