zoukankan      html  css  js  c++  java
  • 简易cmake多文件多目录工程模板

      今天心血来潮,想在服务器上试试写libevent的工程是什么感受,那第一步就是学会怎么用cmake建工程,之前也没接触过cmake,然后一上午,比较懵逼,下午看实验室哥们给的一个教程,然后,慢慢理解CMakeLists.txt怎么写,然后自己在一个多文件多目录的demo基础上,加入shell脚本,实现了现在的简易模板。

      先介绍一下模板的功能

      1.多目录,同一目录下生成一个静态库

      2.可配置target name,denpend lib

      3.shell脚本实现附加目录的清理与创建

      4.配置完成,./build.sh即可

    一、文件目录

    二、建立步骤

    1.自动创建的目录

      bin 可执行文件输出目录

      lib 静态库输出目录

      inc shell脚本自动搜索src下的头文件,并按相对路径复制到inc

      build cmake构建目录

    2.根目录

      将main.cpp 放在根目录 

    #include <iostream>
    #include "test1/test.h"//使用这种相对路径即可,此时头文件已经存在于inc目录
    #include "test2/test2.h"
    using namespace std;
    
    int main(){
        
        testPrint("hello world");
        fun3("hello");
        return 0;
    }

      CMakeLists.txt

    #设置工程名称
    PROJECT(CMAKEDemo)
    #自己定制
    SET(MY_TARGET demo)
    SET(MY_LINK test1 test2)
    
    
    #设置CMAKE最小版本
    CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
    #设置编译器
    SET(CMAKE_CXX_COMPILER "g++")
    #设置构建类型,及相应的编译选项
    SET(CMAKE_BUILD_TYPE "Debug")
    SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
    SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
    
    #设置执行文件输出目录
    SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
    #设置库输出路径
    SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
    
    MESSAGE("++++++++++++++Start Build+++++++++++++++++")
    
    #当前目录的文件
    AUX_SOURCE_DIRECTORY(. SRC_LIST)
    #添加子目录
    ADD_SUBDIRECTORY(src)
    
    #头文件搜索目录
    INCLUDE_DIRECTORIES(inc)
    #链接库搜索路径
    LINK_DIRECTORIES(lib)
    #设置链接库
    #SET(EXTRA_LIBS ${EXTRA_LIBS} test1 test2)
    SET(EXTRA_LIBS ${EXTRA_LIBS} ${MY_LINK})
    
    #生成可执行文件
    ADD_EXECUTABLE(${MY_TARGET} ${SRC_LIST})
    #执行文件链接属性
    TARGET_LINK_LIBRARIES(${MY_TARGET} ${EXTRA_LIBS})

      build.sh

    #!/bin/bash  
    
    set -e  
    
    PROJ_ROOT=$PWD  
    BUILD_ROOT=$PROJ_ROOT  
    echo -e "33[31m Current Build Root: $BUILD_ROOT 33[0m"  
    
    
    
    BIN_PATH=$BUILD_ROOT/bin
    
    if [ -d $BIN_PATH ];then
        cd $BIN_PATH
        rm -rf *
        cd ..
    else
        mkdir -p $BIN_PATH  
    fi
    
    INC_PATH=$BUILD_ROOT/inc
    
    if [ -d $INC_PATH ];then
        cd $INC_PATH
        rm -rf *
        cd ..
    else
        mkdir -p $INC_PATH  
    fi
    
    #cp without path
    #find ./src/ -name "*.h" |xargs -i cp {} ./inc/
    DEST_PATH="./inc/"
    
    headers=`find . -name *.h`
    #echo $headers
    
    for file in $headers
    do
    #echo $file
        temp=${file#*/}
        temp=${temp#*/}
        dstfile=$DEST_PATH$temp
        dstpath=${dstfile%/*}
        #echo $dstpath
        [ -d $dstpath ] || mkdir -p  $dstpath
    
        cp -R $file $dstfile
    
    done
    
    LIB_PATH=$BUILD_ROOT/lib
    
    if [ -d $LIB_PATH ];then
        cd $LIB_PATH
        rm -rf *
        cd ..
    else
        mkdir -p $LIB_PATH  
    fi
    
    BUILD_PATH=$BUILD_ROOT/build
    
    if [ -d $BUILD_PATH ];then
        cd $BUILD_PATH
        rm -rf *
    else
        mkdir -p $BUILD_PATH  
        cd $BUILD_PATH
    fi
    
    cmake  $PROJ_ROOT  
    make -j4

    3.src目录

      CMakeLists.txt

    ADD_SUBDIRECTORY(test1)
    ADD_SUBDIRECTORY(test2)

     test1/CMakeLists.txt

    #所有的路径变量都不允许重名
    AUX_SOURCE_DIRECTORY(. T1_SRC_LIST)
    #设置成静态库
    ADD_LIBRARY(test1 ${T1_SRC_LIST})

      test1/CMakeLists.txt

    AUX_SOURCE_DIRECTORY(. T2_SRC_LIST)
    ADD_LIBRARY(test2 ${T2_SRC_LIST})
      

    click here

  • 相关阅读:
    管理配置KVM,热添加、热迁移
    《google工作整理术》21条原则
    【教你玩转云计算】在阿里云一键安装快速部署Oracle11g 【转】
    Oracle数据库开启归档日志及rman备份情况查询
    【转】CentOS7一键部署OpenStack
    【转】基于openstack安装部署私有云详细图文教程
    Oracle Database 12c数据库中文配置安装图解教程(详细安装步骤)
    精通Linux(第2版) 第3章 设备管理
    精通Linux(第2版) 第2章 基础命令和目录结构
    四种IO 模型
  • 原文地址:https://www.cnblogs.com/tla001/p/6827808.html
Copyright © 2011-2022 走看看