簡易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 "\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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM