简易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 ;
}
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})

简易cmake多文件多目录工程模板的更多相关文章
- cmake指定程序输出目录和库文件输出目录和拷贝文件
概述 本文样式环境: win10+cmake 3.18 本文将介绍使用CMAKE配置项目输出目录和 LIbrary项目的输出目录 本文将介绍 cmake的file函数的基础用法之拷贝文件 重点, 这些 ...
- 为Markdown文件生成目录
缘由 思路 效果 代码实现 缘由 Markdown源生文件源生不支持目录,目前比较主流的生成目录的方式(各式插件),都是转化为HTML文件.虽然HTML文件可以生成眼花缭乱的目录,但是修改起来又没有M ...
- ros error : c++: error: $(catkin_LIBRARIES): 没有那个文件或目录
卧槽,真是........................瞎眼了. 一个半小时才找出错误来..... c++: error: $(catkin_LIBRARIES): 没有那个文件或目录 Oh my ...
- cmake处理多源文件目录
cmake处理多源文件目录 假设我们的源文件全部在src中,则我们需要在子文件src中建立文件CmakeLists.txt,内容如下: AUX_SOURCE_DIRECTORY(. DIR_TEST_ ...
- JavaWeb之基础(1) —— 文件、目录结构和创建项目
1. JavaWeb应用 JavaWeb应用从大类上分为静态和动态两种. 静态应用就是传统的HTML文件+素材资源构造的静态网页,不需要特殊的配置.JavaWeb也不是专门用来做静态网站的. 动态应用 ...
- Linux scp命令详解(服务器之间复制文件或目录)
scp:服务器之间复制文件或目录 一.命令格式: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] ...
- CMake 复制文件方法
我们经常会遇到将第三方库文件复制到项目运行时文件夹,或者将子项目生成的库文件复制到项目运行时文件夹的情况,本文介绍FILE-COPY.add_custom_command.ADD_CUSTOM_TAR ...
- [APUE]文件和目录(中)
一.link.unlink.remove和rename 一个文件可以有多个目录项指向其i节点.使用link函数可以创建一个指向现存文件连接 #include <unistd.h> int ...
- [APUE]文件和目录(上)
一.文件权限 1. 各种ID 我在读这一章时遇到了各种ID,根据名字完全不清楚什么意思,幸好看到了这篇文章,http://blog.csdn.net/ccjjnn19890720/article/de ...
随机推荐
- webapi是如何绑定参数的(How WebAPI does Parameter Binding)
原文地址 由于工作原因,要使用ASP.NET WEBAPI(非mvc webapi),前几天时间一直很紧张,所以webapi一直将就用,今天下午好不容易有时间终于看了下,解决了自己一直疑惑的问题,在此 ...
- Angularjs 数据循环
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- deep learning学习记录一
最近不小心又赶了一下时髦,在做deep learning.今天去听了复旦吴老师的课程,感觉吴老讲解的还是很清晰的. 上午刚看过cnn,下午讲解的就是这章,相对来说,我听着给了很多启发.
- IE浏览器关于ajax的缓存机制
IE浏览器对于同一个URL只返回相同结果.因为,在默认情况下,IE会缓存ajax的请求结果.对于同一个URL地址,在缓存过期之前,只有第一次请求会真正发送到服务端.大多数情况下,我们使用ajax是希望 ...
- 百度 suggestion 学习demo
其他说明文字就不用写那么多了,代码很简单,相信各位道友都能看懂,看不懂的琢磨一下就可以看懂啦.贴代码!拷贝到自己的电脑中运行文件即可,不需要服务器. <!DOCTYPE html> < ...
- js中的throw err的作用
1.阻止程序的运行 2.把错误消息打到控制台
- php第四节(循环和函数)
<?php //循环有 for(){}.有while(){} 有do{}while().foreach(){}循环 //1.for(){} for($i=0;$i<=9;$i++){ ec ...
- 【剑指offer】 Java实现重建二叉树
GitHub上的代码链接 /** * @Author: DaleyZou * @Description: 重建二叉树 * 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树. * 假设输入的前序 ...
- Linux 服务器之间文件传输
linux的scp命令: scp就是secure copy的简写,用于在linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器. 有时我们需要获得远程服务器上 ...
- JQuery实现聊天对话框
效果图如下: HTML代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...