1. 程式人生 > >簡易cmake多文件多目錄工程模板

簡易cmake多文件多目錄工程模板

lis flags sage ext build iostream .sh cmake lease

  今天心血來潮,想在服務器上試試寫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 "\033[31m Current Build Root: $BUILD_ROOT \033[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

簡易cmake多文件多目錄工程模板