简易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})
转载请注明出处:http://www.cnblogs.com/tla001/
一起学习,一起进步