使用include filename中的项目目录
Using project directory in include filename
我正在开发仅限C++头的库,让我们称之为PROJ。当库标头包含另一个标头时,它使用:
#include <proj/foo.h>
编译器(gcc和clang)具有-I path-to-proj-parent
。库的用户在其包含搜索路径中还应该有PROJ的父级。
我使用此方案的理由是,在将此库安装到默认可搜索父级(/usr/include/proj
或/usr/local/include/proj
)的proj
子目录中后,库用户无需指定-I
选项。
这个计划有缺点吗?使用不带proj/
前缀的<foo.h>
是更传统和推荐的方式吗?
问题不在于是否在subdir中安装(将有proj
subdir),而在于如何引用include文件。
如果您查看boost,您会注意到它们使用了类似的方案:
#include <boost/shared_ptr.hpp>
它的优点是可以防止与另一个依赖项中另一个名称相似的文件发生冲突。
然而,在助推的情况下,他们更进一步。如果包含<x/y/z.hpp>
,那么您可能正在处理一个名为::x::y::z
的实体(无论是函数还是类)。也就是说,项目中目录的布局方式模仿了命名空间组织。给自己定位真的很巧妙。
通常,大多数项目都隐藏在子目录(和子目录空间)中,但为了方便起见,最常用的项目被拉到boost
命名空间中,因此它们的头直接位于boost
文件夹中。还有一些方便的标头(其工作只是收集少量其他标头,以便一次将它们全部拉入)。
最后,你可能会注意到,如果你打开一个头文件,他们使用的包含保护遵循完全相同的层次结构:
#ifndef BOOST_SHARED_PTR_HPP_INCLUDED
再一次,因为它有助于避免冲突,因为它是以它所在的文件命名的,而且在整个Boost项目中(在区分大小写的文件系统上),这个位置只能有一个。
如果在安装时创建proj目录,则可以在路径中包含proj。事实上,这是防止与其他包含文件发生名称冲突的好方法。
名称不应该是像"proj"这样的通用名称。它应该是特定于项目的。
- 既然存在危险,为什么项目要使用-I include开关
- 为简单的src,include,libs文件夹项目编写Makefile
- 如何将 #include 添加到<iostream>项目中?
- ROS C++项目"include"文件夹?
- 如何在 Raspbian C++ 项目上"include" libvlc 和 sdl1.2?
- 是否可以将 SDL .lib、.dll 和头文件放在某个地方,以便我可以在 Visual Studio 2017 RC 项目中键入 #include < SDL2.h>?
- "Fatal error C1083: Cannot open include file"但我已将目录添加到项目中
- 获取Qt项目所需的所有include路径、lib等
- 使用include filename中的项目目录
- 向 MFC 项目添加 #include 时的警告 C4995 <vector>
- 如何将一个项目的构建文件复制到第二个项目的include/library目录
- 为最简单的项目生成的EclipseCDT构建并没有正确设置include路径
- 如何在cmake项目中包含/usr/include中的头文件
- 如何在 C++/CLI 项目中 #include 使用 nullptr 的第三方本机 C++ 标头
- 如何在大型项目中预处理具有多个 #include 文件的单个源文件
- 当我在xcode项目中使用 #include < OpenGL/gl.h>行时,它会在哪里查找gl.h文件?
- Visual Studio 2010 C++是否可以从引用的项目继承include路径
- mErrCount:虽然在项目属性的include路径中声明了标识符,但未找到该标识符
- 将include/library目录和链接器参数传播到解决方案中的所有项目
- 忽略项目"Additional include directory"