今天心血來潮,想在服務器上試試寫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})