<<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 项目目录结构的更多相关文章
-
<;<;Modern CMake>;>; 翻译 2.2 CMake 编程
<<Modern CMake>> 翻译 2.2 CMake 编程 流程控制 CMake有一个 if 语句, 经年累月之后,现在它已经相当复杂. 您可以在 if 语句中使用全大写 ...
-
<;<;Modern CMake>;>; 翻译 2. CMake 基础
<<Modern CMake>> 翻译 2. CMake 基础 最低版本 这是每个 CMakeLists.txt 文件的第一行.CMakeLists.txt 是 CMake 所 ...
-
<;<;Modern CMake>;>; 翻译 2.3 与代码通信
<<Modern CMake>> 翻译 2.3 与代码通信 配置文件 CMake 允许您使用代码通过 configure_file 存取 CMake 变量. 此命令复制一个文件 ...
-
<;<;Modern CMake>;>; 翻译 1. CMake 介绍
<<Modern CMake>> 翻译 1. CMake 介绍 人们喜欢讨厌构建系统. 仅仅观看 CppCon17 上的演讲,就可以看到开发人员因为构建系统而闹笑话的例子. 这 ...
-
Angular项目目录结构
前言:不支持MakeDown的博客园调格式的话,真的写到快o(╥﹏╥)o了,所以老夫还是转战到CSDN吧,这边就不更新啦啦啦~ CSDN地址:https://blog.csdn.net/Night20 ...
-
Laravel项目目录结构说明
Laravel项目目录结构说明: |- vendor 目录包含你的 Composer 依赖模块及laravel框架. |- bootstrap 目录包含几个框架启动跟自动加载配置的文件. |- app ...
-
MVVM 模式下iOS项目目录结构详细说明
➠更多技术干货请戳:听云博客 我们在做项目的时候,会经常用到各种设计模式,最常见的要数 MVC (模型,视图,控制器)了.但是,今天我们要说的是另一种设计模式——MVVM. 所以 MVVM 到底是什么 ...
-
1-5Tomcat 目录结构 和 web项目目录结构
对应我的安装路径: web项目目录结构
-
Android开发学习之路--Android Studio项目目录结构简介
既然已经搭建好环境了,那就对Android Studio中项目目录结构做个简单的了解了,这里以最简单的Hello工程为例子,新建好工程后看如下三个工程视图: 1.Android工程 manifests ...
随机推荐
-
Leetcode 笔记 113 - Path Sum II
题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...
-
安装完CentOS 7 后必做的七件事
CentOS是最多人用来运行服务器的 Linux 版本,最新版本是 CentOS 7.当你兴趣勃勃地在一台主机或 VPS 上安装 CentOS 7 后,首要的工作肯定是加强它的安全性,以下列出的七件事 ...
-
【初探移动前端开发04】jQuery Mobile (中)
前言 昨天我们一起学习了一部分jquery mobile的知识,今天我们继续. 这些是些很基础的东西,有朋友觉得这个没有其它的好,但是学习下不吃亏嘛,我反正也不会一起学习基础啦. 例子请使用手机查看哦 ...
-
ecshop 获取某个商品的 所有订单信息 或者销量
把一下代码放到 lib_main.php 1.统计某个下单商品的人数 function get_goods_ordernum($goods_id){ $sql = "select count ...
-
jquery delay()介绍及使用指南
.delay()是用来在jQuery动画效果和类似队列中是最好的.但是,由于其本身的限制,比如无法取消延时——.delay(),它不是JavaScript的原生 setTimeout函数的替代品,这可 ...
-
UNIX标准化及实现之POSIX标准扩展头文件
POSIX标准定义的XSI(X/Open System Interface)扩展头文件 头文件 说明 <cpio.h> cpio归档值 <dlfcn.h> 动态链接 <f ...
-
C语言 linux环境基于socket的简易即时通信程序
转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html ——By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易 ...
-
Swift - 禁用UIWebView和WKWebView的下拉拖动效果
使用UIWebView或WKWebView加载网页时,如果页面处于最顶端时,用户用手指往下拖动,会露出灰色空背景.同样页面在最底部的时候,继续向上拖动,下方也会露出空背景. 要禁止这个拖动效果,可进行 ...
-
三界商城 ajax调用城市接口,竟然需要登录,调用的接口需要登录,如果不登录 重定向到登录
现象 商家入驻 填写信息的 ajax请求没有数据 network->name-headers 返回302 发现调用的接口,需要登录,否则重定向登录 //初始化用户信息查询 public func ...
-
jupyter notebook出现cannot import name &#39;create_prompt_application&#39;问题(Died Kernel)
应该是在安装其它python第三方库时更新了prompt-toolkit版本,降级到下面的版本即可: sudo pip install 'prompt-toolkit==1.0.15'