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

  • 相关阅读:
    Spring基础知识
    Hibernate基础知识
    Struts2基础知识
    在eclipse里头用checkstyle检查项目出现 File contains tab characters (this is the first instance)原因
    java后台获取cookie里面值得方法
    ckplayer 中的style.swf 中的 style.xml 中的修改方法
    java hql case when 的用法
    Windows下Mongodb安装及配置
    Mongodb中经常出现的错误(汇总)child process failed, exited with error number
    Mac 安装mongodb
  • 原文地址:https://www.cnblogs.com/tla001/p/6827808.html
Copyright © 2011-2022 走看看