<<Modern CMake>> 翻译 2.4 项目目录结构

本节内容有点跑题。但我认为这是一个很好的方法。 我将告诉你如何规划项目的目录。 这是基于惯例,但将帮助您:

  • 轻松阅读其他按照相同模式的项目,
  • 避免导致冲突的模式,
  • 避免混淆和使构建变得复杂。

首先,如果您的项目被叫做 project,包含一个链接库叫做 lib,一个可执行文件叫做 app, 那么您的文件目录应该类似以下结构:

- project
- .gitignore
- README.md
- LICENCE.md
- CMakeLists.txt
- cmake
- FindSomeLib.cmake
- include
- project
- lib.hpp
- src
- CMakeLists.txt
- lib.cpp
- apps
- CMakeLists.txt
- app.cpp
- tests
- testlib.cpp
- docs
- Doxyfile.in
- extern
- googletest
- scripts
- helper.py

名字不是绝对的; 你经常会看到关于 test/ vs. tests/ 的争论, 应用程序文件夹可能被叫做其他名称(对于仅限库的项目不存在)。 您还有时会看到 python 目录用于 python 绑定, 或者一个 CMake 文件夹,来放置 CMake 助手文件,例如 Find<library>.cmake 文件。 但主要文件夹上面都列出来了。

注意一些已经很明显的事情; CMakeLists.txt 文件被分别放置在所有源目录中,但 include 目录中没有。 这是因为您应该能够拷贝 include 目录到 /usr/include 或者类似的地方(配置头文件除外,我将在另一章中介绍), 没有任何额外的文件或导致任何冲突。 这也是为什么在 include 目录中有一层 project 目录的原因。 使用 add_subdirectory 来添加包含 CMakeLists.txt 文件的子目录。

您经常需要一个 cmake 目录来放置所有构造助手模块。 这是你的 Find*.cmake 文件该存放的地方。 一组常见的助手文件可以在这里看到 github.com/CLIUtils/cmake

可以这样将此文件夹添加到 CMake 路径上:

set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})

您的 extern 文件夹应该只包含 git 子模块。 这样,您可以显式控制依赖项的版本,同时可以轻松升级。 有关添加子模块的示例,请参阅“测试”一章。

在你的 .gitignore 中,你应该有一些像这样的东西 /build*, 让用户可以在源代码目录创建编译目录,并在这些目录中构建项目。 一些软件包禁止这样做,但它比做一个真正的源外构建要好得多,因为那样每次构建你必须为你构建的软件包键入不同的命令行。

如果要避免在源文件夹中直接进行构建,你可以将其下面这些行添加到你的 CMakeLists.txt 文件的顶部附近:

### Require out-of-source builds
file(TO_CMAKE_PATH "${PROJECT_BINARY_DIR}/CMakeLists.txt" LOC_PATH)
if(EXISTS "${LOC_PATH}")
message(FATAL_ERROR "You cannot build in a source directory (or any directory with a CMakeLists.txt file). Please make a build subdirectory. Feel free to remove CMakeCache.txt and CMakeFiles.")
endif()

<<Modern CMake>> 翻译 2.4 项目目录结构的更多相关文章

  1. <<Modern CMake>> 翻译 2.2 CMake 编程

    <<Modern CMake>> 翻译 2.2 CMake 编程 流程控制 CMake有一个 if 语句, 经年累月之后,现在它已经相当复杂. 您可以在 if 语句中使用全大写 ...

  2. <<Modern CMake>> 翻译 2. CMake 基础

    <<Modern CMake>> 翻译 2. CMake 基础 最低版本 这是每个 CMakeLists.txt 文件的第一行.CMakeLists.txt 是 CMake 所 ...

  3. <<Modern CMake>> 翻译 2.3 与代码通信

    <<Modern CMake>> 翻译 2.3 与代码通信 配置文件 CMake 允许您使用代码通过 configure_file 存取 CMake 变量. 此命令复制一个文件 ...

  4. <<Modern CMake>> 翻译 1. CMake 介绍

    <<Modern CMake>> 翻译 1. CMake 介绍 人们喜欢讨厌构建系统. 仅仅观看 CppCon17 上的演讲,就可以看到开发人员因为构建系统而闹笑话的例子. 这 ...

  5. Angular项目目录结构

    前言:不支持MakeDown的博客园调格式的话,真的写到快o(╥﹏╥)o了,所以老夫还是转战到CSDN吧,这边就不更新啦啦啦~ CSDN地址:https://blog.csdn.net/Night20 ...

  6. Laravel项目目录结构说明

    Laravel项目目录结构说明: |- vendor 目录包含你的 Composer 依赖模块及laravel框架. |- bootstrap 目录包含几个框架启动跟自动加载配置的文件. |- app ...

  7. MVVM 模式下iOS项目目录结构详细说明

    ➠更多技术干货请戳:听云博客 我们在做项目的时候,会经常用到各种设计模式,最常见的要数 MVC (模型,视图,控制器)了.但是,今天我们要说的是另一种设计模式——MVVM. 所以 MVVM 到底是什么 ...

  8. 1-5Tomcat 目录结构 和 web项目目录结构

    对应我的安装路径: web项目目录结构

  9. Android开发学习之路--Android Studio项目目录结构简介

    既然已经搭建好环境了,那就对Android Studio中项目目录结构做个简单的了解了,这里以最简单的Hello工程为例子,新建好工程后看如下三个工程视图: 1.Android工程 manifests ...

随机推荐

  1. CSS3 入门级

    从刚开始学习的选择器总共有十三种: id class 标签 子代 后代 交集 并集 通配符 伪类 结构 属性 相邻 兄弟 (全当复习,如果有用的话那就正好) div[name=zhang]  这是属性 ...

  2. aspnetcore 实现简单的伪静态化

    aspnetcore 实现简单的伪静态化 Intro 在我的活动室预约项目中,有一个公告模块,类似于新闻发布,个人感觉像新闻这种网页基本就是发布的时候编辑一次之后就再也不会改了,最适合静态化了, 静态 ...

  3. .Net 通过设置Access-Control-Allow-Origin来实现跨域访问

    目录 # 前言 # 为每个API接口单独添加响应头 1.针对 ASP.NET MVC 项目的Controllers 2.针对 ASP.NET Web API项目的Controllers 3.针对ASP ...

  4. S7 300数据块中的变量指定断电保持特性

    利用DB块内变量属性的保持性,勾选上就可以保持了.300PLC数据块默认断电保持.

  5. 树链剖分 [JLOI2014]松鼠的新家

    [JLOI2014]松鼠的新家 时间限制: 1 Sec  内存限制: 128 MB 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达, ...

  6. 数据库系统概念:基础的SQL

    public class DataBase { public static void main() { } } /* 3.1 SQL查询语言概览 SQL语言有一下几个部分: 数据定义语言:提供定义关系 ...

  7. Lucene03--字段属性

    Lucene03--字段属性 1.Field 1.1  Field相当于Javabean的属性. 1.2  不同的Field的构造方法参数不一样: 大多数Field的构造函数有三个参数: a)第一个参 ...

  8. Lucene02--入门程序

    Lucene02--入门程序 开发准备: Win10 IDEA JDK1.8 1.新建一个普通的maven工程 1.1 添加依赖 <dependencies> <!-- Junit单 ...

  9. Spring Boot2(十四):单文件上传/下载,文件批量上传

    文件上传和下载在项目中经常用到,这里主要学习SpringBoot完成单个文件上传/下载,批量文件上传的场景应用.结合mysql数据库.jpa数据层操作.thymeleaf页面模板. 一.准备 添加ma ...

  10. python基础知识三 字典-dict + 菜中菜

    3.7字典:dict+菜中菜 1.简介 ​ 无序,可修改,用于存储数据,大量,比列表快,将数据和数据之间关联 ​ 定义:dict1 = {'cx':10,'liwenhu':80,'zhangyu': ...