简易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 ...
随机推荐
- 菜鸟笔记 -- Chapter 6.2.4 成员方法
6.2.4 成员方法 在Java中使用成员方法对应于类对象的行为,在有些地方也会将方法称之为函数,成员方法是定义在类中具有特定功能的一段独立小程序.方法格式如下: 修饰符 返回值类型 成员方法名 ( ...
- Java笔试--代码纠错
package practice.javase; public abstract class Name { private String name; public abstract boolean i ...
- Oracle 序列的创建删除插入
今天学习的是序列的创建蟹盖和删除插入 创建: create Sequence Seq_name increment by n ----序列变化的程度,默认为1,可以为负数表示递减 start ...
- SpringBoot学习16:springboot整合junit单元测试
1.创建maven项目,修改pom.xml文件 <!--springboot项目依赖的父项目--> <parent> <groupId>org.springfram ...
- cornerstone提示“SQLite-database disk image is malformed”
当点击workingCopy时错误如下 google了一下,有是有解决的办法,可是这些都是直接使用sqlite时产生的问题. sqlite错误 The database disk image is m ...
- css选择器有哪些
css的选择器是还是比较富的,主要的css选择器如下: 标签选择器(如:body,div,p,ul,li) .类选择器(如:class="head",class="hea ...
- ABAP术语-Function Module
Function Module 原文:http://www.cnblogs.com/qiangsheng/archive/2008/02/18/1071827.html General-purpose ...
- jQuery 切换图片(图标)效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- let's encrypt部署免费泛域名证书
环境说明 [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) [root@localhos ...
- 百度地图API定位+显示位置
1. 先在需要嵌入地图的页面引入map.js <script src="http://api.map.baidu.com/api?v=2.0&ak=你的秘钥"> ...