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

来源:互联网 发布:股票短线王软件 编辑:程序博客网 时间:2024/06/05 19:03

简介

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.")#可运行文件存放于../binSET(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/bashcurpath=`pwd`buildpath=$curpath/buildif [[ ! -x "$buildpath" ]]; then    mkdir "$buildpath"fiif [[ -z "$1" ]]; then    cd $buildpath    cmake ../ttcp    makeelif [[ $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/*fimv $curpath/bin/ttcp $curpath

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

原创粉丝点击