CMake基础篇---构建可执行文件

简介

CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。
通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程,本文从一个ttcp小项目来介绍linux环境下使用camke构建实例。

目录结构

├── bin
├── make.sh
└── ttcp
    ├── cmake_install.cmake
    ├── CMakeLists.txt
    ├── common.cc
    ├── common.h
    ├── cscope.files
    ├── cscope.out
    ├── main.cc
    ├── Makefile
    ├── make.sh
    ├── mytime.h
    ├── tags
    ├── Timestamp.cc
    ├── Timestamp.h
    ├── ttcp_blocking.cc
    └── ttcp.cc
项目使用boost::program_options动态库,存放于/usr/lib/local

基础语法

用法 功能描述
cmake_minimum_required (VERSION 2.6) 规定cmake程序最低版本
project (CRNode) 指定项目的名称
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) 添加当前工程源文件子目录,指定中间二进制与目标二进制的存放位置
EXCLUDE_FROM_ALL 将这个目录从编译过程中排除除
SET(CMAKE_INSTALL_PREFIX /usr/local) 用来显式的定义变量
CMAKE_INSTALL_PREFIX 外部构建情况下执行make install命令时,make会将生成的可执行文件拷贝到/usr/local/bin目录下
INCLUDE_DIRECTORIES(/usr/include/thrift) 类似gcc中的编译参数“-i”,指定编译过程中编译器搜索头文件的路径
ADD_EXECUTABLE(CRNode ${SRC_LIST}) 生成一个文件名为 CRNode 的可执行文件,相关的源文件是 SRC_LIST 中定义的源文件列表
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) 指定生成的可执行文件位置
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) 指定生成的共享库文件位置
TARGET_LINK_LIBRARIES(CRNode log4cpp thrift) 类似gcc的编译参数“-l”,可以解决外部库的依赖问题
ADD_DEFINITIONS(${CXX_FLAGS} -std=c++0x) 增加编译选项

CMakeLists.txt 文件

cmake_minimum_required (VERSION 2.6)  #运行最低版本

project(ttcp)                         目标文件名

#寻找当前目录下所有目标文件
FILE(GLOB_RECURSE CPP_LISTS "*.cpp")
FILE(GLOB_RECURSE C_LISTS "*.c")
FILE(GLOB_RECURSE CC_LISTS "*.cc")
FILE(GLOB_RECURSE CXX_LISTS "*.cxx")
FILE(GLOB_RECURSE OTHER_LISTS " *.inl")

#外部构建

#动态库存放于./lib下
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib
    CACHE PATH "Single directory for all static libraries.")
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib
    CACHE PATH "Single directory for all dynamic libraries.")

#可运行文件存放于../bin
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ../bin
    CACHE PATH "Single directory for all executable.")


#设SRC_FILES为目标文件
SET(SRC_FILES 
    ${CPP_LISTS}
    ${C_LISTS}
    ${CC_LISTS}
    ${CXX_LISTS}
    ${OTHER_LISTS})


#设置动态库链接目录
FIND_LIBRARY(/usr/local/lib /usr/lib64  /lib61 NO_DEFAULT_PATH)

#设置编译选项
SET(CXX_FLAGS -g -Wall -fPIC)
ADD_DEFINITIONS(${CXX_FLAGS} -std=c++0x)

#动态库链接目录
LINK_DIRECTORIES(/usr/local/lib /usr/lib64)

#指定目标文件
ADD_EXECUTABLE(ttcp ${SRC_FILES})

#链接
set(LINK_LIBRARIES  boost_program_options)
TARGET_LINK_LIBRARIES(ttcp ${LINK_LIBRARIES})

注意:编译模块必须放链接模块前,由于查找的是当前目录所有.cpp 文件,因此可能混入cmake部分代码,推荐使用外部构建,这里提供一个脚本。

外部构建脚本

#! /bin/bash

curpath=`pwd`
buildpath=$curpath/build

if [[ ! -x "$buildpath" ]]; then
    mkdir "$buildpath"
fi

if [[ -z "$1" ]]; then
    cd $buildpath
    cmake ../ttcp
    make
elif [[ $1 == clean && -z "$2" ]]; then
    echo "rm build/ lib/ bin/ ..."
    rm -rf $buildpath/*
    rm -rf $curpath/lib/*
    rm -rf $curpath/bin/*
elif [[ $2 == bin ]]; then
    echo "rm bin/ ..."
    rm -rf $curpath/bin/*
elif [[ $2 == lib ]]; then
    echo "rm lib/ ..."
    rm -rf $curpath/lib/*
elif [[ $2 == build ]]; then
    echo "rm build/ ..."
    rm -rf $buildpath/*
fi

mv $curpath/bin/ttcp $curpath

执行make.sh 即可构建完成。

你可能感兴趣的:(C++)